打造嵌入式c调试系统1-什么是调试系统

系统调试 在Linux系统中,系统调试涉及通过各种工具来分析、排查和修复系统运行中的问题。常见的系统调试任务包括进程管理、内存分析、CPU性能监控、磁盘I/O分析、网络调试等。Linux提供了许多命令和工具来帮助开发者和管理员进行系统调试。查看所有进程:bash复制代码ps aux查看某个用户的进程:bash复制代码1.2 top 命令top 命令提供实时的系统性能视图,包括CPU、内存、负载和运行中的进程。它是一个动态更新的界面,帮助用户监控系统的运行状况。 阅读详情

本系列文章针对嵌入式环境下c语言应用而言的,对其他系统、语言的程序有一定的参考意义,毕竟调试思想应该是相通的。

什么是调试系统

调试(debug)没有标准的定义,个人的理解是,调试是一种能够快速定位乃至能预防问题发生的技术手段。调试针对的是已发生问题的定位,这一点问题不大,对于预防问题发生有些人可能不赞同,其实,程序能够正常运行,不代表程序没有问题(没有完美的软件),就像人,看起来活蹦乱跳的,但不代表身体很健康,也可能处于一种亚健康状态,只是暂时没表现出来而已,如果程序处于亚健康状态,找出其中的问题,这个工作也是调试的范畴。

调试就是debug,一说到debug,大家可能都想会想到DEBUG版本和gdb(或windows的vs,本文针对嵌入式的,对其他平台也有参考意义),但调试技术的范围比DEBUG版本和调试器要大,使用调试器(gdb)调试DEBUG版本的程序,当然是调试工作的一部分,但调试工作远不止这些,调试贯穿了整个开发运营过程,可以从以下几个阶段来认识调试:

  • 设计阶段,调试设计是调试的重要环节,出了问题,没有准备、没有手段,不可能快速定位到问题。
  • 开发阶段,开发时,软件工程师加班写bug是不可避免的,而掌握调试方法可以加快开发进度,减少加班时间。
  • 测试阶段,调试与测试本是兄弟,这个环节是互补的、相辅相成的。
  • 运营阶段,事中分析、事后分析是最能体现调试价值的活,时间就是金钱,这里就能很好体现出来。
    所以调试是一个体系,是一系列设计、方法、工具应用的组合,这就是所谓的调试系统。

调试系统的意义

成体系的实施调试过程,能大幅度的提高调试的成功率与效率。提高项目的成功率,调试过程中,能发现系统的问题与缺陷,有助于反向推动系统的发展水平,形成良性循环。

调试与测试

测试与调试都是与软件的问题打交道的,所有可以连起来用,如完成功能调测,为更好的学习调试,需要对测试与调试做一些区分,这里列举了一些调测的共同与差异。

共同点

  • 是软件质量保证的一部分,也是最重要的2个点。
  • 都是与软件bug打交道的,有些工作是重叠的。
  • 调试与测试都是需要经过设计的,都是成体系的东西。
  • 很多调测的技术是相通的,用的工具都有重叠。
  • 实施调测的可能是同一拨人,调测一家人。

差异点

  • 侧重点不一样,测试重在通过用例提高覆盖率,发现问题(挑错)与防止已出现问题的再次出现,而调试重在定位解决问题(排错)。
  • 测试一般要求可自动连续运行且中间较少要求人工参与,调试则无此要求。
  • 测试测试事前,是前质量保证手段,调试工作发生在事中或事后,是后质量保证手段。
  • 稳定性不同,测试的预见性较强,而调试需很多推理、猜测、验证的过程。
  • 度量方式不一样,测试度量的主要有覆盖率、自动化程度,调试一般就讲究效率(够快)和成功率(减少迷案)。
  • 项目中参与阶段不一样,测试一般在发布前完成,而调试是全阶段的。
  • 活动流程不一致,测试是有计划、章程的,调试是按需求来的。
  • 设计的重点不一样,测试重在可重复场景设计、如何获取输入输出、模拟等,调试重在过程监控,事故定位与现场还原。
  • 系统调优是调试工作经常要做的工作,测试关注的是优化的效果、极限验证的情况。

嵌入式调试特点

嵌入式平台与pc平台的差异决定了嵌入式调试与pc调试的差异,主要体现在资源限制方面:

  • 存储空间不一样,很多嵌入式系统对flash有限制,有好工具放不进去也白搭,工具选用有取舍,必要的情况下要裁剪、重复造简单的轮子。
  • 内存和cpu有限制,调试系统不能占用太多的系统资源,应用功能优先,调试需取舍。

需要明确一点,调试设计是需要消耗系统资源的,虽然说功能优先,但完全不给调试资源,调试活动就很难达成,这需要整体取舍,调试系统也可以反向优化资源的使用,一般情况下,在调试上的投入能抵消调试自身的消耗(资源和效率就是水,看你挤不挤得出来),linux的proc虚拟文件系统就是例子,资源再紧张,也不能把这个干掉。这就是磨刀不误砍柴工,在做调试设计之前,最好能定出最大资源占用比例,避免做的过程中缩手缩脚。

调试系统的组成

这里根据个人经验收集了一些调试系统包含的内容,并分别做一些说明。不同的调试点适用于不同的场合,重要性大家可以自己判别。具体的实现方式,后续的系列文章会做说明。

状态信息

参考linux的proc虚拟文件系统,有多少工具是基于proc系统的,linux嵌入式工程师都应该能体会到它的重要性,proc文件系统是一个典型的状态信息系统。光状态信息这一项都能成为一个系统,proc文件系统是非常复杂的,涉及面又太广,很少人说完全熟悉proc每项内容。
状态信息系统不光对内核有重大意义,也是应用不可或缺的一部分,所谓的状态信息系统,包括:

  • 状态信息是一些全局量、过程量、统计信息的外在体现。
  • 系统当前的运行状态,对监控者来说,系统是透明的,运行过程是可量化的。
  • 包含必要的统计信息,系统功能可能用不到这些信息,但对系统监控是不可缺少的。
  • 信息需成体系,如相关模块A与B,模块A的输出能与模块B的输入对接,对接的不止是功能,状态信息也能匹配。

日志信息

日志是调试系统的重要一环,linux的dmesg可以看作为一种日志,日志分为几类:

  • 动态日志,能够动态调整级别的,有需要就输出。
  • 静态日志,DEBUG模式的日志或者固定输出的日志。
  • 磁盘或flash日志、内存日志(带缓存的,dmesg是动态内存日志)、直接日志(不带缓存,直接输出)

资源管理

所谓资源包括内存、句柄、线程、锁、CPU占用、带宽等管理,包括:

  • 栈溢出保护、栈深度检测
  • 堆内存管理,包括使用量、泄露、double free等情况管理
  • 句柄管理,统计、误关闭处理、泄露等管理
  • 线程占用资源、线程数量管理
  • 锁统计与测试设计
    资源管理这块,程序内部没有相关的资源管理设计,通过外部工具也能做一部分,但设计了过后,会加快排查速度,提高结案率。

系统调优

调优也是一种调试工作,就是边调试边优化,调优是个细活,外部工具能把握大方向,细化还得靠内部统计信息,如老大要求内存减少20%,你得知道内存都用在那个地方了,单靠外部工具很难知道每个模块用了多少内存。

异常退出

简单说就是程序崩溃了,嵌入式设备上你不大可能能用上coredump信息,这个东西太大,一般还得自己捕获崩溃信息,定位出崩溃栈。当然,异常退出的原因非常多,需要根据退出时的信号来分析,如oom-killer也是一种典型的异常退出方式。

其他

  • 终端输出重定向、捕获、过滤分析等。
  • 工具编写(脚本、状态自动监测分析等)。

知识点

设计调试系统时,掌握一些知识和工具是非常必要的,下面是个人收集的一些通用的(不包括网络、磁盘等,自成领域)知识点。

  • elf格式、内存分布、bfd库、符号symbol获取、proc中maps(smaps、status等)理解。
  • 帧栈的理解,APCS、unwind栈回溯。
  • 信号signal种类与处理,Interrupted system call处理,ucontext函数族,线程锁,线程私有数据、nptl、内存屏障。
  • ptrace系统调用使用方法,进程操作(wait,waitpid等)。
  • fuse系统、netlink机制、共享内存、消息队列。
  • top,htop、strace,gdb、linux proc信息、gcc编译选项。
  • tcmalloc、jemalloc、libunwind等外部库。
  • 强弱符号、gcc wrap函数替换、动态库符号导入与覆盖。
嵌入式的意义 <br />从大学本科开始,就从事着跟嵌入式相关的工作,至今为止,没有脱离“囹圄”。<br />同时,我也在反思,嵌入式的目标在哪里。<br />在学校的时候,就跟着老师做项目。用单片机做各种工业用的仪器和设备。自己选件,自己设计电路,自己画电路板,自己焊接,自己编程调试。现在想来,那确实是一段优秀的经历。很多做嵌入式的人是从应用软件转过来的,他们对硬件了解很低级,遇到硬件就头疼。可是想自己从头开始学,有没有那么多的资源。就算某些人,可以读懂电路图,却无法知道如何选件,如何设计,如何布线和制版。那是需要烧钱 阅读详情

相关推荐

(一)硬件实战--手把手打造基于F1C200S的Linux迷你游戏机(嵌入式开发)

本文详细介绍了如何基于F1C200S芯片打造一款Linux迷你游戏机,涵盖硬件设计、系统配置及调试技巧。F1C200S凭借其高性价比和低功耗特性,成为复古游戏机的理想选择。文章重点解析了电源电路、游戏操控设计及显示音频优化,并提供了实用的Linux系统定制和模拟器调优方案,助力开发者快速实现嵌入式游戏机项目。

weixin_28726391的博客 370

调试系统

NULL 博文链接:https://ivan-yan.iteye.com/blog/1473320

让STC8G单片机也能‘说话’:用printf和串口1打造你的调试信息输出系统(基于Keil C51

本文详细介绍了如何在STC8G单片机上使用printf和串口1构建高效的调试信息输出系统。通过串口初始化、putchar重定向以及Keil C51下的printf格式解析,开发者可以快速搭建调试框架,提升嵌入式开发效率。文章还提供了条件编译、多数据类型输出等进阶技巧,帮助优化调试流程。

weixin_29182481的博客 327

ARM调试系统

ARM调试系统通常由多个组件构成,包括调试器、调试接口、目标硬件和软件等。它提供了各种调试功能,如单步执行、断点设置、变量查看和修改、内存访问等,使开发人员能够深入了解程序的运行过程,找出潜在的问题并进行优化。ARM调试系统是用于调试基于ARM架构的处理器系统的一套工具和技术集合,它涵盖了硬件调试接口、软件调试工具以及相关的调试协议。

MHD0815的博客 1437

嵌入式系统调试方式

嵌入式系统调试方法概述

weixin_55953651的博客 2951

嵌入式系统调试手段及方法综述

摘要:在数字信息技术和网络技术高速发展的今天,嵌入式系统已经广泛地渗透到人们的日 常生活等方方面面中。而在嵌入式系统开发流程中调试是一个相当重要的环节.调试器是衡 量一个系统开发环境优劣的重要因素。嵌入式系统的特点决定了发过程中交叉调试的必然性。 本论文的主要工作是对当前两种主流的交叉调试技术即目标监控程序调试技术和片上调试 技术进行研究与实现,之后对目前在嵌入式系统开发中

houyahuiyu的专栏 1万+

3步打造嵌入式调试利器:Mongoose日志系统深度解析

嵌入式开发中,调试往往是最耗费时间的环节。当设备被部署到实际环境后,传统的调试器可能无法接入,这时一个功能完善的日志系统就成了开发者的"千里眼"。Mongoose作为一款轻量级嵌入式Web服务器,其日志系统设计兼顾了资源受限环境的特殊性与调试信息的全面性。本文将从日志系统架构、实战配置到高级应用,带你掌握嵌入式场景下的日志调试最佳实践。 ## 日志系统核心架构 Mongoose日志系统的核心...

gitblog_00385的博客 833

用C语言开发嵌入式温度监控系统实战

DHT11作为温湿度传感器,OLED屏幕通过I2C协议通信,这些都是嵌入式开发中很常见的组件。这里要注意的是,不同开发板的引脚定义可能不同,需要根据具体型号调整。遇到问题时,可以从最简单的例程开始,逐步添加功能,这样更容易定位问题所在。这个平台最让我惊喜的是它的一键部署功能,可以快速验证代码效果,省去了很多环境配置的时间。这个项目虽然看起来简单,但涵盖了嵌入式开发的几个核心环节,特别适合用来巩固C语言基础和硬件交互能力。上,你不仅能找到类似的参考项目,还能直接在线编辑和运行代码,非常适合初学者快速上手。

MoonbeamRaven28的博客 748

MobaXterm调试助手:嵌入式系统开发者的远程工具箱

MobaXterm是一款集成了多种网络客户端功能的工具,专为需要高效远程管理服务器的IT专业人员设计。它将多种终端仿真器(如SSH、Telnet、RDP、VNC等)和网络工具(如SFTP客户端、端口转发器、X服务器等)整合到一个易于使用的界面中,大大简化了远程工作流程。MobaXterm 的插件系统是其一大特色,它允许用户根据自己的需求扩展软件的功能。这一节将介绍插件系统的基本概念和优势。插件是小型的软件模块,它们可以被添加到 MobaXterm 中以提供额外的功能。

weixin_42583683的博客 1055

嵌入式开发必备:用C宏定义打造轻量级日志系统(附分级调试技巧)

本文介绍如何利用C语言的宏定义和__VA_ARGS__等特性,为资源受限的嵌入式环境构建一个轻量级、可分级控制的日志系统。该系统通过预处理和条件编译实现近乎零开销的调试信息管理,支持从FATAL到DEBUG的多级别日志输出,并自动携带文件、行号等上下文信息,大幅提升嵌入式开发调试效率与代码优雅度。

wdx012345的博客 1065

告别枯燥参数调试:用MiaoUI为嵌入式设备打造人性化交互体验

MiaoUI是一款专为嵌入式设备设计的轻量级菜单UI框架,基于u8g2图形库和C语言实现,为单色OLED屏幕提供人性化交互体验。它支持列表和图标菜单、智能文本处理与流畅动画,显著提升智能家居和工业设备的操作直观性,告别传统枯燥的参数调试方式。

h9j8k7l6m5n的博客 895

我的嵌入式系统设计修炼之路

我们写下的每行代码,都在硅晶片上刻下心跳的纹路;调试通过的每个系统,都是数字世界新生的生命。当示波器曲线开始呼吸,当传感器数据穿越云端,我触摸到了物理与数字的边界——这或许就是嵌入式开发者独有的浪漫。

fsx050624的博客 661

深入解析uclibc与glibc:嵌入式与桌面系统的C库选择指南

本文深入解析了uclibc与glibc两大C标准库的核心区别与适用场景。glibc功能全面、标准符合性高,适用于桌面和服务器系统;而uclibc则追求极致轻量,专为资源受限的嵌入式设备设计,尤其在无MMU系统中具有独特优势。文章通过体积、功能、可配置性等维度的详细对比,为开发者在不同项目需求下做出明智选择提供了实用指南。

lambda的博客 912

硬件嵌入式工程师必会linux+c编程知识总结

你已经掌握了作为一名合格的嵌入式工程师所需要精通的全部核心知识点、会写的关键代码、以及相关的深入分析。这份“通关秘籍”不仅覆盖了你培训班的全部内容,更在此基础上进行了扩展和深度剖析,旨在让你: 拥有扎实的Linux底层功底: 能够熟练操作Linux环境,编写自动化脚本,并配置嵌入式开发所需的网络服务。 精通C语言高级编程: 能够编写高效、健壮、安全的C代码,并深入理解其内存机制。 掌握高效的开发工具: 熟练使用GDB进行调试,编写Makefile自动化项目构建。 具备解决实际问题的能力: 不仅停留在

c5dnuser的博客 1034

VSCode+C编译器配置指南:打造高效开发环境

在当今的软件开发领域,拥有一个高效的开发环境至关重要。Visual Studio Code(VSCode)作为一款轻量级、功能强大且高度可定制的代码编辑器,受到了广大技术人员的喜爱。而C语言作为一门经典且广泛应用的编程语言,在系统软件、嵌入式开发等众多领域发挥着关键作用。将VSCode与C编译器进行合理配置,能够让开发者在编写、调试C语言代码时更加得心应手。本文将详细介绍如何在VSCode中配置C编译器,打造一个高效的C语言开发环境。

星辰夜语的博客 1464

嵌入式秋招备战指南:从C语言到RTOS,打造高竞争力简历与面试策略

嵌入式系统开发是连接软件与硬件的核心技术领域,其核心在于通过微控制器(MCU)和实时操作系统(RTOS)实现对物理设备的精准控制。从原理上看,开发者需要深入理解计算机体系结构、操作系统调度机制以及硬件通信协议,才能编写出高效、可靠的嵌入式软件。这项技术的价值在于其广泛应用于物联网、智能家居、工业自动化等关键场景,是实现万物互联的基石。对于即将参加秋招的开发者而言,掌握以STM32为代表的MCU开发、精通FreeRTOS等实时操作系统的任务调度与通信机制,并能够将这些知识融入具体的项目实践,是构建核心竞争力的

weixin_34248023的博客 330

5个实用调试技巧:为轻量级Llama2.c打造高效日志系统

Llama2.c是一个轻量级的Llama 2推理项目,仅用一个纯C文件即可实现功能。在开发和使用过程中,一个高效的日志系统能帮助开发者快速定位问题、优化性能。本文将分享5个实用调试技巧,教你如何为Llama2.c打造高效日志系统。 [![Llama2.c项目形象图](https://raw.gitcode.com/GitHub_Trending/ll/llama2.c/raw/350e04fe3

gitblog_00168的博客 313
上一篇: fuse接口用法说明
下一篇: 打造嵌入式c调试系统2--状态信息实现
他山随悟
博客等级 码龄18年 81粉丝 19原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值