`
隐形的翅膀
  • 浏览: 483781 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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调试GDB调试

    GDB调试GDB调试GDB调试GDB调试GDB调试 GDB调试GDB调试GDB调试GDB调试GDB调试

    用GDB调试程序(整理有书签).pdf

    陈浩-用GDB调试程序(整理有书签).pdf+守望的个人博客-GDB调试指南(整理有书签).pdf

    用GDB调试程序 用GDB调试程序

    用GDB调试程序 用GDB调试程序 用GDB调试程序 用GDB调试程序 用GDB调试程序 用GDB调试程序

    GDB调试精粹及使用实例GDB调试精粹及使用实例

    GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹及使用实例GDB调试精粹...

    GDB调试程序[陈皓]&GDB调试工具指南

    GDB调试程序[陈皓] GDB调试工具指南 两个pdf文件

    gdb调试器的使用,gdb

    gdb调试器的使用gdb调试器的使用gdb调试器的使用gdb调试器的使用gdb调试器的使用

    gdb调试大全GDB调试入门必备

    是学习嵌入式的很好的资料哦!里面详细介绍了怎样用gdb调试程序,是嵌入式程序调试入门必备的资料!

    用GDB调试程序.pdf

    用GDB调试程序 重新编排,整洁美观。 GDB 概述 GDB 是GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。或许,各位比较喜欢那种图形界面方 式的,像VC、BCB 等IDE 的调试,但如果你是在 UNIX 平台下做软件,你...

    linux下GDB调试

    用GDB调试程序 GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常...

    STM32 GDB调试手册

    此文详细介绍如何用GDB调试STM32,是STM的官方手册

    Linux GDB调试文档

    使用GDB调试,英文版。对于从事 Linux C/C++ 后台开发的读者来说,GDB 调试是需要熟练掌握的一项技能

    Linux下gdb调试工具指南

    非常详细的介绍 Linux下gdb调试工具指南

    gdb调试详解 讲述如何使用gdb调试以及调试core dump

    讲述常用gdb命令,以及讲述如何使用gdb调试程序崩溃后产生的core dump文件,让您在linux下开发更轻松

    GDB调试手册(中文版)

    GDB调试手册,中文版,很适合新手的手册,有基本用法有示例,我一直用着过来的,所以分享一下

    Linux课件:GDB调试简明指南.pdf

    Linux课件:GDB调试简明指南.pdf

    GDB 调试 中文手册

    GDB调试中文手册。GDB调试命令详述,完整的中文手册。

    GDB调试工具指南.pdf

    GDB调试工具指南.pdf GDB调试工具指南.pdf

    一个可以用gdb调试linux内核的环境

    自己搭建的一个可以用gdb调试linux内核的环境,解压后看README,其中有详细的搭建过程。 简单来说就是在一台linux主机上用bochs虚拟机调试内核。 用到的工具: 一台linux主机 bochs源码,压缩包中已有 busybox源码,...

    GDB调试打印STL PROTOBUF

    GDB调试打印STL PROTOBUF,只要放到.gdbinit文件中就可以直接打印MAP LIST VECTOR SET DEQUEUE等等STL容器里装的东西了。还有PROTOBUF里装的东西也可以打印出来,调试时看PB协议很方便。

Global site tag (gtag.js) - Google Analytics