gdb调试学习

GDB是一个由GNU开源组织发布的,UNIX/LINUX操作系统下的,基于命令行,功能强大的程序调试工具。可以用来调试C,C++程序。在今天验收实验时发生特别尴尬的事情,由于在编译.c文件的时候没有加-g选项,所以一直无法用gdb调试程序,所以在总结gdb之前先来看看gcc在编译时的参数。

A.常规选项
1、没有任何选项:gcc   helloworld.c

结果会在与helloworld.c相同的目录下产生一个a.out的可执行文件。


2、-o选项,指定输出文件名:gcc -o helloworld helloworld.c

-o意思是Output即需要指定输出的可执行文件的名称。这里的名称为helloworld。


3、-c选项,只编译,不汇编连接:gcc -c helloworld.c

-c意思就是Compile,产生一个叫helloworld.o的目标文件


4、-S选项,产生汇编源文件:gcc -S helloworld.c

-S意思就是aSsemble,产生一个叫helloworld.s的汇编源文件


5、-E选项,预处理C源文件:gcc -E helloworld.c


-E意思就是prEprocess。输出不是送到一个文件而是标准输出。当然可以对它进行重定向:


gcc -E helloworld.c > helloworld.txt


B.优化选项


1、 -O选项,基本优化:gcc -O helloworld.c


-O意思就是Optimize,产生一个经过优化的叫作a.out的可执行文件。也可以同时使用-o选项,以指定输出文件名。如:


gcc -O -o test helloworld.c


即会产生一个叫test的经过优化的可执行文件。


2、-O2选项,最大优化:gcc -O2 helloworld.c


产生一个经过最大优化的叫作a.out的可执行文件。


C. 调试选项


1、 -g选项,产生供gdb调试用的可执行文件:gcc -g helloworld.c


产生一个叫作a.out的可执行文件,大小明显比只用-o选项编译汇编连接后的文件大。


2、-pg选项,产生供gprof剖析用的可执行文件:gcc -pg helloworld.c


产生一个叫作a.out的执行文件,大小明显比用-g选项后产生的文件还大。


-g选项的作业是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。(类似于VS里的Debug和Release)

得到可执行文件后,接下来就可以用gdb来进行调试了。

1.list(l) 列出源代码,接着上次的位置往下列,每次列十行,可以自己接上一个list再回车继续列出。

gdb调试学习_第1张图片

2.list+行号 这个命令我在其他一些资料里是列出从第几行开始的源代码,但事实上我在使用时是显示该行号作为中间值的十行。

gdb调试学习_第2张图片

3.break(b)+行号 在某一行设置普通断点。

4.run(r) 运行调试程序(如果程序中没有设置断点,则程序会一直运行到结束或者出现异常结束,如果设置断点,则会在断点处停止)

5.print(p)+变量名  查看变量值

gdb调试学习_第3张图片

6.set var +变量名赋值 修改变量的值,或者使用print +变量名赋值修改变量的值

gdb调试学习_第4张图片

7.next(n) 执行下一行语句,单步调试

gdb调试学习_第5张图片

8.continue(c) 继续执行程序知道下一个断点或者程序结束

gdb调试学习_第6张图片

9.info(i) <> 显示各类信息,详情查看“help info”,例如info breakpoint 查看所有断点

10.clear 清空所有断点信息

gdb调试学习_第7张图片

11.quit(q) 退出gdb调试环境

gdb调试学习_第8张图片

12.step(s) 执行下一行语句,如果有函数调用则进入到函数中

13.start 开始执行程序,停在main函数第一行语句前等待命令

14.backtrace(bt) 查看各级函数调用及参数


总结:gdb调试功能强大,而且对于IDE来言,使用命令更为方便快捷,学会调试的基本操作,有利于我们发现代码中的错误,同时,更应该掌握的是调试的思路和技巧,这需要我们在长期的实践中不断训练。

你可能感兴趣的:(计算机系统)