之前在使用linux的时候,无论使用gdb还是kdb,都可以在程序运行时进行debug,可以很方便的看到各种调用栈、变量等,还可以随时切换线程观察某个线程执行的状态。甚至在程序执行异常时,还能产生corefile文件,事后使用gdb就又可以查看异常时的现场,能查看到当时程序执行时各种变量、内存、寄存器等,有这些信息就可以让推导任何问题都有了可能,所以玩意儿可以说是非常的方便开发者调试分析问题。
但是,在嵌入式环境中,一般的芯片跑个rtos,他并没有linux那么完备的功能和机制,甚至受限于厂家的实力和软件生态压根就没啥调试手段,这就导致程序往往在跑出异常时要么根据printf反复复现,要么根据经验直接断定问题,有经验当然是好事,但是大多数时候对于大多数人根本就没啥经验,这就导致调试困难重重。
嵌入式开发中,一般都提供仿真器调试功能,如jtag等等,于是便有了一种调试模式:gdb+openocd。openocd指的是debug server一类型的东西,它运行之后可以监听某个tcp端口,然后我们就可以使用gdb远程连接到此端口上,然后可以happy的使用各种gdb命令了。当然,这里的gdb功能相比linux可能有点缩水,但是大多数的功能都是可以的,已经非常方便了。大多数的IDE所谓的在线调试,其实也就是使用gdb远程模式这套机制,套在了前端ui上了而已,让人使用变得简单,不用手敲各种命令了。但是,我发现有个比较麻烦的事情,那就是使用rtos时,gdb并不能像linux中那样使用直接观察、切换线程等,默认只能观察到当前执行的位置。
因为当前freertos比较流行,我搜了一圈,网上倒是有些什么项目、IDE的插件之类的可以让这种功能实现,但是它是收费的!我在想为啥freertos为啥没人写个咋使用gdb分析调试freertos任务状态的文章呢,于是本文就来探讨一下这种方法,下面分使用调试器实时分析、不使用调试器分析异常现场两类进行。
一、使用调试器实时分析
如,arm contex-m3,调试器可以使用jlink,debugserver可以使用openocd,gdb可以使用arm gcc工具链中的,程序对应的elf文件为xxx.elf。当本地openocd启动后,默认是监听tcp 3333端口,那么可以使用下述命令进行gdb连接:
🔒 本文后半部分需关注公众号解锁
请在公众号回复“文章解锁”获取验证码。

验证码 5 分钟内有效,单次使用