嵌入式学习小组
直播中

余温重顾

9年用户 881经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计
私信 关注

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

为什么需要使用命令行调试程序?
通过嵌入式开发中通过命令行调试程序的过程是怎样的?

回帖(1)

李颖

2021-12-24 16:44:42
为什么需要使用命令行调试程序

大部分时间内我们使用 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 的内存范围。
总结

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

更多回帖

发帖
×
20
完善资料,
赚取积分