linux下c/c++程序gdb单步调试
步骤:
使用gcc(g++)对源程序进行编译生成可执行文件,编译时加上个-g选项,如gcc test.c -g -o aaa;
此时生成可执行文件aaa,输入命令gdb aaa;
此时进入gdb模式,输入l(小写字母l),查看源代码,找到需要进行调试的函数或者行号;
例如想要对200行开始进行调试,在200行加入断点,b 200;
运行代码,输入r;
输入n进行单步调试不进入函数,输入s可以进行函数,如果想要查看某个变量的值,使用print,例如,想要查看变量ppp的值,输入print ppp;
输入q退出单步调试;
linux下gdb调试查看源代码
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
版权声明:本文为博主原创文章,转载请附上博文链接!
GDB调试中动态显示执行的代码
在GDB调试中, 大家都知道使用list命令来显示代码:
例如:
显示main.c中的main函数附近的代码: list main.c:main
显示main函数附近的代码: list main
显示main.c中的第2到20行的代码: list main.c:2,20
显示第10到20行的代码: list 10, 20
虽然list已经很方便了, 但还是不尽人意. 如果能够在运行的同时显示代码就好了, 答案是肯定的.
使用如下命令启动gdb: gdb -tui main 或者在启动gdb后, 输入命令focus或layout:
(GDB版本要求: 7.0及以上)