嵌入式中使用命令行调试程序

为什么需要使用命令行调试程序

大部分时间内我们使用 IDE 中提供的功能就可图形化的调试程序,IDE 为我们屏蔽了调试过程中的一些细节。在一些特殊环境中,我们可能不得不手动使用命令行来调试程序,这时如果事先没有研究过调试的步骤,也许会手忙脚乱。在本文中我就讲下使用命令行调试程序的一般步骤。

调试步骤

1. 打开一个 gdb server 端

我们使用 jlink 调试的时候,通过将 jlink 与板子连接并打开 seegr 提供的 jlink gdb server 就创建了一个 gdb server 服务端,这个服务端会监听 2331 这个端口,客户端可以通过这个端口连接到服务器端加载程序进行调试。

2. 使用 gdb 来连接到 server 端

嵌入式中一般使用交叉编译的 gdb 程序来连接到 server 端。这里以 arm-none-eabi-gdb.exe 为例演示连接的过程。

arm-none-eabi-gdb.exe ./test.elf
# ignore input
(gdb) target remote localhost:2331

通过这样的过程就能够连接到服务器端,连接成功后 gdb server 中会提示有客户端连入,并显示客户端的一些信息。

也可以先打开 gdb 程序,然后执行 file 命令加载 elf 程序后再连接服务器端。

3. 执行必要的 gdb 脚本

对于需要配置一些参数的情况,诸如关闭 watchdog,配置 sdram 等,可将这些过程写入到一个 gdb 脚本中,在连接成功后执行这个脚本,就可以完成初始化配置。甚至于也可以将连接服务器端的过程也写入到 gdb 脚本中,这样直接执行脚本便完成了 2、3 步的过程。

执行的命令示例如下:

source test.gdb

输出信息同样能够在 gdb server 中看到。

4. 加载程序

这一步需要加载 elf 程序到板子上,可以烧到 flash 中,也可以直接加载到内存中执行。这一步使用 load 命令即可。

5. 添加、查看、使能、禁能、删除断点

加载完成后可以添加、删除断点,一个具体的示例如下:

(gdb) b main
Breakpoint 1 at 0x1eccf: file main.c, line 50.
(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000001eccf in main 
                                                   at main.c:50
(gdb) disable break 1
(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep n   0x000000000001eccf in main 
                                                   at main.c:50
(gdb) enable break 1
(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000001eccf in main 
                                                   at main.c:50
(gdb) delete break 1
(gdb) info break
No breakpoints or watchpoints.

6. 运行程序

断点设置完成后就可以运行程序了,执行 continue 命令即可执行。

7. 查看寄存器、变量、内存地址的值

可以使用 print 命令来查看寄存器的值,寄存器名称前面要加 $ 符号用于区分普通变量名。同时 print 可以指定一个显示参数,这一参数表示了显示的数据格式,默认为十进制,可以选择十六进制与八进制的显示格式。x 命令可用来查看一段内存区域的值。

8. watch 某个地址

在调试一些疑难杂症的时候,watch 指令是一个利器,它能够在程序修改监控地址数据的时候停下来,这样我们就能够立刻定位到问题,它甚至可以添加一些简单的条件,可以用在更为复杂的环境中!

9. dump 程序到文件中来比较

如果你怀疑执行的程序与下载的程序不一致,那么你可以将执行的程序 dump 出来,使用二进制比较软件进行比较。格式如下:

dump [format] memory filename start_addr end_addr

一般使用的文件格式是 elf 格式,这里的 format 替换为 binary 即可,filename 是保存到本地的文件名称,start_addr 与 end_addr 表示了 dump 的内存范围。

总结

本文描述了通过嵌入式开发中通过命令行调试程序的过程,本文仅仅选取了一些主要的步骤来进行描述,希望能给需要的朋友提供参考!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值