1 一个工程产品案例的剖析
- 背景:
- 嵌入式实现系统对时序的要求比较严格
- 各个线程的执行有相对严格的时间要求
- 痛点:
- 断点调试在嵌入式实时系统中不适用
2 常规解决方案
2.1 日志调试法
- 在代码中的“关键位置”添加打印语句
- 打印语句尽可能详细的打印上下文信息(函数名、局部变量等)
- 当系统出现问题时,查看日志文件,分析问题
2.2 日志调试法存在的问题
- 不易维护
- 打印语句分散于产品代码的各个角落
- 影响效率
- 过多的打印语句意味着过多的IO操作,影响产品的整体执行效率
- 分析困难
- 当日志输出量非常多的时候,非常难精确定位问题
- 也许只有添加打印语句的工程师能够看得懂日志输出
3 一个疯狂的想法
同时结合日志调试法和断点调试法的优点,使得实时系统调试时,能够任意查看指定代码行上下文的信息,并且,不增加打印语句,不暂停执行。
4 解决方案
- 获取原程序指定行对应的代码地址
- 把代码地址中的指令替换为中断触发指令
- 在中断服务程序中抓取全局信息和栈信息
- 抓取的信息发送回调试程序解析并输出
5 实践结果
- 基于ARM+Linux平台完整实现
- 通过中断原理成功获取上下文信息
- 完全不影响程序执行时序
- 产品关键技术点
- 中断、ISR、编译信息、GDB
- GUI、Socket、多线程
修改记录
时间 | 动作 |
---|---|
2017.6.5 | 首次上传 |
参考资料
唐老师 — 狄泰软件学院 — 十二月提升计划
李云 — 《专业嵌入式软件开发 全面走向高质量编程》