且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JLink + GDB 调试方法

更新时间:2022-04-04 12:51:52

本节主要介绍嵌入式开发中常用的JLink+GDB调试方法。

调试所需软件 J-link,可以从https://www.segger.com下载对应操作系统的软件包,然后安装
(注意:segger是仿真器的名字,相当常用的一款,仿真器的接口也是固定的,一般开发版上都会带有这个调试接口,如图)
JLink + GDB 调试方法

运行JLinkGDBServer
JLink + GDB 调试方法

按照上图中的配置,配置GDBServer,然后点击OK,进入下一个界面
JLink + GDB 调试方法

注意,如果硬件连接没有问题,那么上图中的J-Link和 Device栏中显示绿色,GDB显示为红色,因为我们还没有运行GDB软件。另外,请注意图中的“Listening on TCP/IP port 2331”,这个端口要我们在运行GDB时需要。

运行GDB,开始调试(例如:调试镜像为helloworld):

a. 打开命令行,进入到镜像所在目录,执行命令 arm-none-eabi-gdb   helloworld.elf
b. 连接GDBServer的2331端口。在GDB命令行中执行命令 tar ext:2331
c. 设置断点,如在ResetHandler处设置断点,执行命令 b ResetHandler
d.  开始运行,执行命令 r 

复位命令执行后,程序将停止在ResetHandler处。 还可以设置其他断点, 如 b main、b HardFault_Handler等。其他GDB命令都支持,如图:
JLink + GDB 调试方法

常用技巧 -- watch命令

 什么是watchpoint?

  watchpoint,顾名思义,其一般用来观察某个变量/内存地址的状态(也可以是表达式),如可以监控该变量/内存值是否被程序读/写情况。

 在gdb中可通过下面的几种方法来设置watchpoint:

  (gdb) watch  
 在指定变量/内存地址(表达式)expr设置一个watchpoint。一但expr值有变化时,将停住程序。

  (gdb) rwatch
 当expr被读时,停住程序。

  (gdb) awatch
 当expr被读或被写时,停住程序。

  (gdb) info watchpoints

查看watchpoint

(gdb)d n
删除watchpoint, 同删除breakpoint一样

举例:
想监控0地址处其实的1K字节是否被访问,若有read或者write访问,则程序停下
awatch (char[1024])*0x0

想监控0x1001dd08处的一段结构体的内部数据是否被改写,若发生改写则程序停下,只读无影响
watch ((k_mm_list_t *)0x1001dd08)->mbinfo->free_ptr