写这篇博客的目的是因为我刚刚用gdb解决了一个c语言中赋错了值的问题,导致整个程序的运行结果是不正常的,这是我求助于gdb解决了这个问题,之前也用gdb这个神器解决过一些运行时的内存问题,比如说c程序中非常常见的segment error。这篇博客为了对gdb的常用命令做一个备忘,记录回顾下使用gdb的过程加深记忆。gdb是linux环境下一个非常著名的C语言调试工具,而且也非常的好用,对于解决C语言的各种bug非常拿手,对于c语言下常见的内存问题,可以说能非常快速的定位并解决问题。这篇博客首先通过介绍gdb的基本使用,后面补充gdb的各种使用命令,我还想列出一些典型的使用环境来做一个总结性的说明,不过这个就留到以后再补充吧,现阶段,我对gdb的了解还是比较有限的。
1、gdb的基本使用
如果要使用gdb来调试C应用,在编译C程序的时候必须加入-g参数,shell命令如下所示:
gcc -g hello.c -o hello
通过这个参数,可以在编译的时候在程序中加入必要的调试信息。突然想起一个问题,没有加-g参数来调试会出现什么情况呢?根据其他人的说法,是看不到变量名等信息,将会以内存中的地址替代,下次有机会试下。
在编译好之后就可以通过gdb装载程序来调试了,启动gdb的方式就是在shell中直接输入gdb,要调试那个程序,就把程序名作为参数跟在命令后面,shell命令如下:
gdb hello
这里的hello就是上面通过gcc编译产生的包含有调试信息的程序文件。程序装载之后并没有开始真正运行程序,要让程序运行起来我们才可以观察程序的执行,要让程序运行起来可以使用下面的命令:
run
或者
start
这样编译好的二进制文件就可以运行了。下一步就是,通过一些命令来观察程序的输出和运行状态了。常用的命令有下面这些:
list #打印运行位置附近的程序源码
print #打印指定的变量名的值
然后这里有非常重要的一点就是断点的问题,如果程序是因为运行的时候会出现意料之外的情况,而来调试的话,那么设置断点就是必须的了,否则,一运行程序就运行结束了,就来不及观察了。而通过设置断点的方式,可以让程序运行在这个地方的时候暂时停下来,让我们有机会可以观察程序的输入,以找出问题所在。
设置断点的常用命令有下面这些:
break #设置断点,可以简写为b
b 10 #设置断点,在源程序第10行
b func #设置断点,在func函数入口处
多文件情况下的断点设置可以使用下面的命令:
break filename:linenum #在源文件filename的linenum行处停住
break filename:function #在源文件filename的function函数的入口处停住
查询所有断点可以通过下面命令:
info b
2、常用的gdb命令
命令 | 解释 | 示例 |
---|---|---|
r | Run的简写,运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。 | (gdb) r |
c | Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。 | (gdb) c |
b <行号> ; b <函数名称> ; b <函数名称> ; b <代码地址> ; d [编号] | b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。 | (gdb) b 8;(gdb); b main |
s, n | s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;n: 执行一行源程序代码,此行代码中的函数调用也一并执行。s 相当于其它调试器中的“Step Into (单步跟踪进入)”;n 相当于其它调试器中的“Step Over (单步跟踪)”。这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。 | (gdb) s |
si, ni | si命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。 | (gdb) si |
p <变量名称> | Print的简写,显示指定变量(临时变量或全局变量)的值。 | (gdb) p i |
i | Info的简写,用于显示各类信息,详情请查阅“help i”。 | (gdb) i r |
q | Quit的简写,退出GDB调试环境。 | (gdb) q |
help [命令名称] | GDB帮助命令,提供对GDB名种命令的解释说明。如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。 | (gdb) help display |
[1]:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2288004.html” GDB详解”
[2]:http://blog.csdn.net/liigo/article/details/582231” GDB十分钟教程”