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:打印栈帧关系
●启动你的程序,能够按照你的自定义的要求为所欲为的运行程序。
●可以让被调试的程序在你所指定的调置的断点处停住。(断点能够是条件表达式)
●当程序被停住时,能够检查此时你的程序中所发生的事。
●动态的改变你程序的执行环境。
调试指令:
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 版权声明:本文为博主原创文章,转载请附上博文连接!