上篇文章里提到如何生成core dumps,调试core dumps对于linux程序员也是家常便饭,这篇文章介绍在linux系统里如何通过gdb调试core dumps 文件。对于程序的编译,运行那是另外一个话题,此篇文章略过,只谈gdb命令和gdb调试core dumps文件。
gdb简单命令:
1、开始和停止
gdb program.exe
装载程序
run
运行程序,命令也可以用简写 r
r < file r [argv]
通过传递文件流, 或者参数运行程序
help
帮助命令,简单列出gdb命令信息,简写为h
help [name]
列出具体命令帮助信息,name为命令名
quit退出gdb调试程序,简写为q
2、代码查看和断点
list 20
从当前代码开始,列出20行代码 ,并且指向最后一行,下次再执行list,从当前行开始。如果list参数为空,列出当前10行代码,如果是两个参数,列出范围代码。简写为 l
list function
列出当前函数前后代码
info
列出当前信息,比如info break,列出断点信息,info stack 列出当前堆栈信息,info frame 列出当前程序执行的程式信息。
frame
当前程序将要执行的程式信息,简写为f
break
在当前frame下断点,简写为b
b n
在程序第n行下断点
b function
在函数内部第一条可执行语句下断点。
delete n
删除第n个断点,如果不带参数,删除所有断点,简写为del
watch i == 3
设置观察判断语句,一旦程序执行到满足条件的地方,程序停止。这个功能对于循环调试帮助非常大。同时对于空指针,非法值调试起到事半功倍的效果。
print var
打印变量值和数据结构,简写为p
display val
每执行一条程式,都显示一次变量的值,其实watch才是最佳选择
undisplay val取消对变量val的显示
3、单步调试
next
执行下一条程式,遇到程序直接跳过,简写为n
step
执行下一条程式,遇到函数,跳入函数,简写为s
finish
执行完程序,并暂停到函数下一行可执行程式。
continue
继续运行程序,直到下一个断点暂停,或者如果没有断点,程序执行完毕,退出。简写为c
call function()
调用函数,并且可以传递参数,这对调试或者测试来说,太实用了,并且调用函数不影响当前程序的执行。
set x value设置变量x的值为value,在调试程序的时候,可以设置假想值,调试程序还是很方便的。
4、堆栈调试
backtrace
显示当前执行程式的堆栈信息,简写为bt
up
上一层堆栈
down
下一层堆栈
return从当前函数退出,在当前执行函数的下一条执行程式暂停。
gdb调试core dumps:
gdb program core
载入dump文件, program为产生dump的文件,这两个必须要一致,不然符号表和程序完全对不上,如果没有及时发现,会耽误很多时间。运行dump 文件后,程序会停在崩溃程式的那一行,然后就可以通过,print, up, down 这些命令来精确定位程序bug。
总结:
上面只是罗列出部分gdb命令,gdb, make, gcc 每个工具都足够写一本书的,可能很多人怕麻烦,认为我有Ide,啥都用鼠标搞定,为啥学习这些东西浪费时间。其实磨刀不误砍柴工,ide的可视化界面只不过是加了漂亮的外壳而已,不过不明白原理和基础,在学习和实用C/C++的道路上会遇到更多的问题,花费更加巨量的时间。可能开始感觉学习这些东西浪费时间了,但把这些东西搞透了,后面反而节省了更多的时间。那种方式更高效,显而易见。
参考资料:
http://betterexplained.com/articles/debugging-with-gdb/
http://www.cs.dartmouth.edu/~campbell/cs50/gdb.html