1. GDB调试利器¶
1.1. GDB简介¶
在单片机开发中,KEIL、IAR、ADS1.2等集成开发环境下的调试工具对程序开发有很大的帮助, 尤其是出现各种疑难杂症的bug时,往往只能通过单步调试、堆栈查询、CPU寄存器查询、 甚至是反汇编来定位问题。同样的,在嵌入式Linux的开发环境下,也有能够实现类似功能的调试器,那就是GDB(GNU debugger)。 它是一个由GNU开源组织发布的,UNIX/LINUX操作系统下的、基于命令行的、功能强大的调试工具, 是嵌入式linux开发人员必不可少的工具。
1.2. GDB的使用¶
1.2.2. 添加程序调试信息¶
本章节示例代码在:embed_linux_tutorial/base_code/linux_debug/gdb_use/hello.c
把代码源文件通过NFS网络文件系统拷贝到开发板后,使用gcc进行编译,-g参数表示添加调试信息。
1 | gcc -g hello.c -o hello
|
如下图:
1.2.6. 设置断点¶
运行break(简写b)命令可以在指定行设置一个断点,断点调试是程序调试里面使用频率最高的技巧,务必熟练掌握。
设置方法为“b”命令后加上相应的行号,在这里以在第6、7行设置断点为例:
1.2.7. 查看断点信息¶
设置好断点后,执行以下命令查看断点信息:
1 | info b
|
如下图:
含义解释:
NUM:断点编号
Disp:断点执行一次之后是否还有效(keep:有效 dis:无效)
Enb:当前断点是否有效(y:有效 n:无效)
Address:内存地址
1.2.8. 单步调试¶
continue(简写c):继续执行,到下一个断点处(或运行结束)。
next(简写n):单步执行,跳过子函数。
strp(简写s):单步执行,进入子函数。
示例:在第6行设置来断点后,先输入r指令让程序运行到断点处,然后执行n指令进行单步调试, 可以看到第6行的打印信息在单步执行后,输出“hello,world”打印信息。 如下图:
示例:在第6行设置来断点后,先输入r指令让程序运行到断点处,然后执行s指令进行单步调试, 可以看到程序已经进入到printf函数的内部中。继续执行c指令,可以让程序继续运行。
如下图:
1.2.10. 清除断点¶
使用clear指令可以删除某一行对应的断点,用法为clear+行号。
1.2.11. 运行至函数结束¶
使用finish指令可以让程序运行到函数结束位置。
1.2.13. 退出gdb¶
执行quit(简写q)会退出gdb调试,返回到控制台终端。