本节主要介绍嵌入式开发中常用的JLink+GDB调试方法。
调试所需软件 J-link,可以从https://www.segger.com下载对应操作系统的软件包,然后安装
(注意:segger是仿真器的名字,相当常用的一款,仿真器的接口也是固定的,一般开发版上都会带有这个调试接口,如图)
运行JLinkGDBServer
按照上图中的配置,配置GDBServer,然后点击OK,进入下一个界面
注意,如果硬件连接没有问题,那么上图中的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命令都支持,如图:
常用技巧 -- 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