GDB 调试

http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F#.E8.AE.BE.E7.BD.AE.E8.A7.82.E5.AF.9F.E7.82.B9.EF.BC.88WatchPoint.EF.BC.89

rwatch i if i==5
watch i if i==3
c
print i
info b

step <count>
    单步跟踪,如果有函数调用,他会进入该函数

next <count>
    同样单步跟踪,如果有函数调用,他不会进入该函数

如果出现任何关于debuginfo-install的错误
cd /etc/yum.repon.d/
vi CentOS-Debuginfo.repo
set enable=1 in debug part
或者copy这个文件到没有CentOS-Debuginfo.repo文件的机器上


1. 启动GDB的方法有以下几种:

    gdb <program>

    program也就是你的执行文件,一般在当前目录下。

    gdb <program> core

    用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

    gdb <program> <PID>

    如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。


2. 当以gdb <program>方式启动gdb后,gdb会在PATH路径和当前目录中搜索<program>的源文件


3. 暂停/恢复程序运行

调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。

当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。

在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(Watch Point)、捕捉点(Catch Point)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是 continue命令。

4. 设置断点(Break Points)

我们用break命令来设置断点。下面有几点设置断点的方法:

break <function>
    在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。

break <linenum>
    在指定行号停住。

break +offset
break -offset
    在当前行号的前面或后面的offset行停住。offiset为自然数。

break filename:linenum
    在源文件filename的linenum行处停住。

break filename:function
    在源文件filename的function函数的入口处停住。

break *address
    在程序运行的内存地址处停住。

break
    break命令没有参数时,表示在下一条指令处停住。

break ... if <condition>
    ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i==100,表示当i为100时停住程序。

查看断点时,可使用info命令,如下所示:(注:n表示断点号)

    info breakpoints [n]
    info break [n]

5. 设置观察点(WatchPoint)

观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:

watch <expr>
    为表达式(变量)expr设置一个观察点。一表达式值有变化时,马上停住程序。

rwatch <expr>
    当表达式(变量)expr被读时,停住程序。

awatch <expr>
    当表达式(变量)的值被读或被写时,停住程序。

info watchpoints
    列出当前所设置了的所有观察点。

[编辑] 设置捕捉点(CatchPoint)

你可设置捕捉点来捕捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:

    catch <event>

当event发生时,停住程序。event可以是下面的内容:

    throw 一个C++抛出的异常。(throw为关键字)
    catch 一个C++捕捉到的异常。(catch为关键字)
    exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
    fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
    vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
    load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
    unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

    tcatch <event>

只设置一次捕捉点,当程序停住以後,该点被自动删除。

6. 维护停止点

上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。

clear
    清除所有的已定义的停止点。

clear <function>
clear <filename:function>
    清除所有设置在函数上的停止点。

clear <linenum>
clear <filename:linenum>
    清除所有设置在指定行上的停止点。

delete [breakpoints] [range...]
    删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。


比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。

disable [breakpoints] [range...]

7. 恢复程序运行和单步调试

当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。

continue [ignore-count]
c [ignore-count]
fg [ignore-count]
    恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思。

step <count>
    单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

next <count>
    同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

set step-mode
set step-mode on
    打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数很有利于查看机器码。

set step-mode off
    关闭step-mode模式。

finish
    运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

until 或 u
    当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

stepi 或 si
nexti 或 ni
    单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是 “display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)

你可能感兴趣的:(gdb)