韦东山 STM32 嵌入式单片机RTOS 调试专题 ARM架构调试技巧
ARM单片机/RTOS项目
20小时
1399100005收藏
立即购买

单片机_RTOS调试技术

都会写代码,调试拉开差距

都是工程师,谁不会写代码?调试水平高,才能胜出!

我在中兴时,一牛人同事到点就下班,从不加班,为何?

系统出Bug时,他出马就能搞定!公司得供着他。

他是我的榜样。

还是在中兴,2007年,我用了一个月解决了困扰部门多个产品的诡异问题,发现是内核处理信号的bug。
因此获得了当年的S级员工奖励。
凭借着强大的调试能力,各个科室碰到一些疑难问题都会找我。
年终奖也位于前列。

解决Bug,升职加薪赚外快

技术部门,技术说话,技术强要么升职要么加薪要么自己干。

不想太累还可以接外包。
2022年某大厂的朋友研发猫砂机器人碰到问题,他们调试了2、3个月,我去通宵调了2天搞定。


你有没有碰到过这些疑难问题?

  • 库函数出错
    千锤百炼的open、fclose函数,怎么会出错
  • 加上printf程序没问题,去掉就出错
  • 改改优化等级,程序就无法运行了
  • A()用不了,for(int i = 0; i < 1; i++)A();就没问题
  • 死机,完全没反应、没输出
  • 发生Hardfault,有没有通用的分析方法?

这些众多问题我们都有办法解决!

RTOS的调试难题

假设你有A、B、C三个线程,
你如何确定它们分别执行到了哪里?
即使你有调试器,你最多能调试一个线程,其他线程的运行情况你无从知道!

假设线程A在处理数据,线程B在等待A的数据,线程C独立运行,
现在出问题了,你不知道线程A、B、C分别跑到了哪里?
怎么办?

培训大纲

在rtt上100行代码实现coredump

本课程,提供源码,这些源码可以用在你们的工程里,不依赖于具体
百问网在rt-thread上实现了coredump功能:

  • 出错时可以coredump
  • 也可以输入命令触发coredump
  • 然后使用百问网的CoreDebugger即可分析各个线程的调用过程
  • 实现coredump命令


  • ARM架构

    • 汇编指令
    • C函数的反汇编代码
    • ARM-Thumb过程调用标准
    • 中断处理过程
    • 栈与堆的使用
  • 调试技术

    • 栈回溯技术

      • 原理
    • 手工实现栈回溯分析

      • 在工程里添加代码实现栈回溯半自动分析
      • 生成core文件,结合gdb工具实现栈回溯全自动分析:这是Linux下的技术,百问网正在研发在单片机上实现
      • 调试实例
    • 堆越界访问:slab debug

      • 原理
      • 在工程里添加代码实现堆的调试
      • 调试实例
    • 内存泄漏

      • 原理
      • 改进堆的管理代码,解决内存泄漏问题
      • 调试实例
    • watchpoint

      • 变量被无故修改时,捕获运行信息
      • 变量被读取时,捕获运行信息
      • 调试实例
    • 手工打桩

      • 对于一些程序,无法重新编译程序,没有调试器,怎么办?
      • 有些程序,稍微增减代码就崩溃,怎么办?
      • 我们修改bin文件里的汇编吗,让它触发异常以打印更多信息,同时不影响程序的运行

01-资料下载与学习指南

  1. 调试专题课程介绍
  2. 资料下载与学习方法

02-常规的调试技术

  1. 常规调试方法
  2. 条件断点
  3. 读写内存_变量触发断点
  4. 不影响程序运行的断点使用方法

03-ARM架构

  1. 单片机硬件系统
  2. 汇编指令_读写内存LDR_STR
  3. 汇编指令_PUSH_POP
  4. 汇编指令_ADD_SUB
  5. 汇编指令_AND_ORR
  6. 汇编指令_CMP_vTST
  7. 汇编指令_B_BX_BL_BLX
  8. ARM架构过程调用标准(AAPCS)
  9. 异常处理流程
  10. 异常示例

04-奇怪Bug背后的原因

  1. 局部数组越界破坏其他变量
  2. 局部数组越界破坏发返回地址
  3. 增加打印结果不一样

05-栈回溯的多种使用方法

  1. 栈回溯原理_栈里保存有LR
  2. 栈回溯手工分析
  3. 栈回溯PC无效看LR
  4. 栈的构造过程
  5. 答疑
  6. PC和LR都被破坏

06-脱离调试器的调试方法

  1. 异常处理流程的进一步细化
  2. 使用FPU的异常示例
  3. 打印寄存器和栈调试“除0”
  4. 打印信息解决PC或LR被破坏的Bug
  5. 生成core文件使用GDB调试

07-数据被破坏的调试方法

  1. 修改bin文件_手工打断点
  2. 数据观察点和跟踪(DWT)

08-RTOS的调试方法

  1. FreeRTOS和RT-Thread里现场如何保存
  2. 在FreeRTOS里确定任务卡在哪里
  3. 答疑
  4. 在RT-Thread里确定线程阻塞在哪里
  5. 在RT-Thread里调试多个线程
  6. 在FreeRTOS里调试多个任务
  7. 答疑

09-实例1 UCOS中断栈溢出Bug

  1. UCOS的Bug_结论1 ldleTask栈被破坏
  2. UCOs的Bug 结论2ISR栈太小了
  3. UCOS的Bug 解决问题

10-实例2 沁恒RISC-V芯片RTT中断嵌套Bug

  1. risc-v rt-thread中断嵌套Bug的现象与解决
  2. risc-v架构简明教程特别说明
  3. 几条汇编指令
  4. 使用2个简单的C函数理解内幕
  5. RISCV异常处理流程
  6. CH32V203异常处理流程
  7. CH32V203上rtt线程切换代码分析
  8. 发现问题 main线程的栈指向了错误的位置
  9. Bug的根源与解决

11-实例3 全局变量加volatile

  1. 全局变量没有加volatile的变量

12-实例4 FreeRTOS上MQTT无法订阅消息

  1. 现象_收到订阅的消息但是没有处理
  2. 问题_发出sub请求 尚未构造ack链表就收到了suback
  3. 第1种解决方法 修改MQTT库
  4. 总结
  5. 第2种解决办法 调整任务优先级
  6. 答疑

课程观看

课程通过加密方式进行观看购买后
客服会发送课程登录用户名密码,以及观看方式。
因文件为加密离线播放,需要提前下载课程加密文件,使用加密播放器打开进行播放。

配套资料

服务支持

售前问题:
淘宝 https://100ask.taobao.com
售后问题:
交流社区:https://forums.100ask.net

交流学习

讨论群
学习交流微信群:http://wiki.100ask.org/Community#%E5%BE%AE%E4%BF%A1%E4%BA%A4%E6%B5%81%E7%BE%A4

学习交流QQ群: http://wiki.100ask.org/Community#QQ%E4%BA%A4%E6%B5%81%E7%BE%A4