GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
●启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
●可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
●当程序被停住时,可以检查此时你的程序中所发生的事。
●动态的改变你程序的执行环境。
调试指令:
gdb+a.out
l :从main函数开始开始
l + 行号
l + 函数名
b + 行号:设断点
b + 函数名
i b:查看断点信息
r:执行(有断点则在第一个断点处停下来)
n:单步向下执行
s:单步执行,且可以进入函数
print +内容:打印内容
whatis +内容:查看该内容的类型
d +编号:删除编号处(不是行号)的断点。
b +行号 if i==9:设置条件断点
finish:执行到当前函数返回处(退出函数)
bt:打印栈帧关系
首先直接列出问题及其解决方法:设置a.cpp:1234这样的断点后(断点位于.so文件中),gdb知道停在哪个函数,并能够停下来,但是无法显示源文件名及行号,也无法看到源码。明显是gdb有问题或者是调试信息有问题,我试遍了-g , -gstabs , -ggdb , -gstabs+参数,最终,-gstabs+参数可以和我的gdb完美配合,输出了我想要的东西,能够在debug的时候正确的看到函数名,行号,并能正确的看到源代码。这段话是在我解决问题之后添加在原文章之前的。供快速参考。好了,现在来看一个一般性的问题:有时候在用gdb调试程序的时候,发现gdb找不到源码。用list命令无效。记住: gdb的调试信息中并不包含源码,只是包含了怎样去寻找源码,但是因为某种原因,比如你的源码转移了位置或者别的原因。你需要告诉gdb到哪里去寻找源码。这个通过directory命令来实现。 要查看当前gdb寻找源码的路径:show directories添加一个新的路径到查找路径:dir dirname添加多个时,个dirname用: 分开。详细见 : http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_48.html 另外:有时候发现调试信息不正确,或者没有调试信息,而gcc在编译的时候使用的参数为-g ,这时,可以个参数-g 该为-gstabs 就可以了。 我现在碰到的就是这种情况,具体原因还不是很清楚。当利用-gstabs编译以后,程序在停下来的时候,会显示函数堆栈,每个栈会显示源文件以及行数,但是源代码还是列不出来,原因是directory还没有设好 。后来发现-gstabs编译后,有些源码的位置被弄错了。继续尝试-gstabs+ , 最终才看到期望的效果。 需要后续的去了解下这几个参数之前的区别以及为什么要这么用。
---------------------
作者:sunxiaopengsun
来源:CSDN
原文:https://blog.csdn.net/sunxiaopengsun/article/details/79445300
版权声明:本文为博主原创文章,转载请附上博文链接!
---------------------
作者:龙跃十二
来源:CSDN
原文:https://blog.csdn.net/qq_38646470/article/details/79901401
版权声明:本文为博主原创文章,转载请附上博文链接!