JLink + GDB 调试方法

本文详细介绍如何使用JLink与GDB进行嵌入式开发调试,包括软件安装、GDBServer配置及常见命令应用,如设置断点、运行程序、使用watch命令监控变量状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

运行JLinkGDBServer
image

按照上图中的配置,配置GDBServer,然后点击OK,进入下一个界面
image

注意,如果硬件连接没有问题,那么上图中的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命令都支持,如图:
image

常用技巧 -- 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

### 使用 JLink 进行 GDB 调试 #### 准备工作 为了成功配置并使用 JLinkGDB 对 STM32 设备进行调试,需完成几个必要的准备工作: - **JLink 安装**:确保已按照官方指导正确安装了 JLink 驱动及相关工具[^1]。 - **交叉编译链设置**:对于 Linux 用户而言,在开始之前还需确认已经设置了适合目标平台的 GCC 工具链环境变量 PATH 中包含了 arm-none-eabi-gcc 等命令路径。 #### 启动 JLink Server 并连接设备 通过命令行启动 `JLinkExe` 或者图形界面版的应用程序来建立与硬件之间的通信链接。当一切正常运作时,“J-Link”和“Device”标签会呈现为绿色状态,表明当前连接无误;而此时尽管 "GDB" 显示为红色也属预期之内——因为尚未启动实际的 GDB 实例[^2]。 ```bash $ JLinkExe -if SWD -device STM32F407VG ``` 上述指令指定了接口类型(SWD)以及具体的目标微控制器型号(STM32F407VG),可根据实际情况调整这些参数以匹配所使用的硬件。 #### 设置 GDB 以便远程调试 接下来就是准备 GDB 的部分了。这里需要注意的是,默认情况下 JLink 将监听 TCP/IP 协议下的特定端口号用于接收来自客户端的连接请求,默认值通常是 2331。因此,在启动 GDB 前应当准备好相应的配置文件或直接指定选项让其知道去哪里寻找服务器。 ```bash $ arm-none-eabi-gdb ./your_program.elf (gdb) target extended-remote :2331 ``` 这段脚本展示了如何加载待调试的应用程序 ELF 文件进入 GDB,并告知它通过本地机器上的某个开放端口去尝试连接到远端正在等待中的 JLink server。 #### 开始调试过程 一旦完成了以上所有前置条件之后就可以正式开启调试环节啦! 可以利用如下所示的一些常用命令来进行断点设定、查看寄存器内容或是逐步执行代码等功能操作[^4]。 | 功能 | GDB Command | | -------------- | | 查看帮助 | help | | 加载符号表 | file your_program | | 设置断点 | break main | | 继续执行 | continue | | 步入函数 | step | | 执行下一条语句 | next | 此外还可以借助 TUI 模式获得更直观的操作体验,只需在启动 GDB 时加上 `-tui` 参数即可实现源码视图与控制台共存的效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值