每当程序停止,任何人想明白的第一件事就是它为什么停止,以及怎么停在那里的。该信息被称为反向跟踪。由程序产生每个函数调用和局部变量,传递的参数,调用位置等信息一起存储在堆栈内的数据块种,被称为一帧。我们可以使用GDB来检查所有这些数据。 GDB从最底层的帧开始给这些帧编号。
bt: 打印整个堆栈的回溯
bt 打印n个帧的回溯
frame : 切换到指定的帧,并打印该帧
up : 上移'n'个帧
down : 下移'n'个帧 ( n默认是1)
检查数据:程序的数据可以在里面GDB使用'print'命令进行检查。例如,如果'x'是调试程序内的变量,'print x'会打印x的值。
检查源码:源码可以在GDB中打印。默认情况下,'list'命令会打印10行代码。
list : 列出'linenum'行周围的源码
list : 从'function'开始列出源码
disas : 显示该函数机器代码
停止和恢复程序:使用GDB,我们可以在必要的地方设置断点,观察点等来停止程序。
break : 在'location'设置一个断点。当在程序执行到这里时断点将被击中,控制权被交给用户。
watch : 当'expr'被程序写入而且它的值发生变化时GDB将停止
catch : 当'event'发生时GDB停止
disable : 禁用指定断点
enable : 启用指定断点
delete : 删除 断点/观察点/捕获点。 如果没有传递参数默认操作是在所有的断点
step: 一步一步执行程序
continue: 继续执行程序,直到执行完毕
退出 GDB:用'quit'命令还从GDB中退出。
GDB还有更多的可用选项。里面GDB使用help选项了解更多详情。
在GDB中获得帮助
总结在这篇文章中,我们已经看到不同类型的Linux用户空间的调试工具。总结以上所有内容,如下是什么时候使用该什么的快速指南:
基本调试,获得关键变量 - print 语句
获取有关文件系统支持,可用内存,CPU,运行程序的内核状态等信息 - 查询 /proc 文件系统
最初的问题诊断,系统调用或库调用的相关问题,了解程序流程 – strace / ltrace
应用程序内存空间的问题 – valgrind
检查应用程序运行时的行为,分析应用程序崩溃 – gdb