GDB是一个由GNU开源组织发布的,UNIX/LINUX操作系统下的,基于命令行,功能强大的程序调试工具。可以用来调试C,C++程序。在今天验收实验时发生特别尴尬的事情,由于在编译.c文件的时候没有加-g选项,所以一直无法用gdb调试程序,所以在总结gdb之前先来看看gcc在编译时的参数。
A.常规选项
1、没有任何选项:gcc helloworld.c
结果会在与helloworld.c相同的目录下产生一个a.out的可执行文件。
-o意思是Output即需要指定输出的可执行文件的名称。这里的名称为helloworld。
-c意思就是Compile,产生一个叫helloworld.o的目标文件
-S意思就是aSsemble,产生一个叫helloworld.s的汇编源文件
产生一个叫作a.out的执行文件,大小明显比用-g选项后产生的文件还大。
-g选项的作业是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。(类似于VS里的Debug和Release)
得到可执行文件后,接下来就可以用gdb来进行调试了。
1.list(l) 列出源代码,接着上次的位置往下列,每次列十行,可以自己接上一个list再回车继续列出。
2.list+行号 这个命令我在其他一些资料里是列出从第几行开始的源代码,但事实上我在使用时是显示该行号作为中间值的十行。
3.break(b)+行号 在某一行设置普通断点。
4.run(r) 运行调试程序(如果程序中没有设置断点,则程序会一直运行到结束或者出现异常结束,如果设置断点,则会在断点处停止)
5.print(p)+变量名 查看变量值
6.set var +变量名赋值 修改变量的值,或者使用print +变量名赋值修改变量的值
7.next(n) 执行下一行语句,单步调试
8.continue(c) 继续执行程序知道下一个断点或者程序结束
9.info(i) <> 显示各类信息,详情查看“help info”,例如info breakpoint 查看所有断点
10.clear 清空所有断点信息
11.quit(q) 退出gdb调试环境
12.step(s) 执行下一行语句,如果有函数调用则进入到函数中
13.start 开始执行程序,停在main函数第一行语句前等待命令
14.backtrace(bt) 查看各级函数调用及参数
总结:gdb调试功能强大,而且对于IDE来言,使用命令更为方便快捷,学会调试的基本操作,有利于我们发现代码中的错误,同时,更应该掌握的是调试的思路和技巧,这需要我们在长期的实践中不断训练。