zoukankan      html  css  js  c++  java
  • gdb调试5--工程项目的断点调试

    之前说过断点调试,但是针对的是单文件的断点调试。在实际应用中,一个项目是多目录多文件的

     参考资料:gdb debugger

    目录结构:

    $ tree
    .
    ├── gdbSomeFiles.cpp
    ├── Libs
    │   ├── add.cpp
    │   ├── add.h
    │   └── makefile
    └── makefile

    add.h

    1 #pragma once
    2 
    3 class CAdd
    4 {
    5 public:
    6         CAdd(void);
    7         int add(int &a, int &b);
    8         virtual ~CAdd(void);
    9 };
    add.h

    add.cpp

     1 #include "add.h"
     2 
     3 CAdd::CAdd(void)
     4 {
     5 }
     6 
     7 int CAdd::add(int &a, int &b)
     8 {
     9         int ret = a + b;
    10         return ret;
    11 }
    12 
    13 CAdd::~CAdd(void)
    14 {
    15 }
    add.cpp

    上层makefile

    1 CFLAGS=-g -Wall -pedantic -std=c++0x
    2 xmain:$(OBJS)
    3 #       g++ ${CFLAGS} -c -I. add.cpp
    4 #       ar rc libadd.a add.o
    5 #       g++ $(CFLAGS) gdbSomeFiles.cpp -o xmain -I./Libs -L./Libs -ladd
    6         g++ $(CFLAGS) gdbSomeFiles.cpp -o xmain -I./Libs -L. -ladd
    7 clean:
    8         rm -f xmain $(OBJS) *.o *.a *~
    makefile

    Libs里面的makefile

    1 #OBJS=gdbSomeFiles.o
    2 CFLAGS=-g -Wall -pedantic -std=c++0x
    3 main:
    4         g++ ${CFLAGS} -c -I. add.cpp
    5         ar rc libadd.a add.o
    6         mv libadd.a ../
    7 clean:
    8         rm -f xmain $(OBJS) *.o *.a *~
    makefile

    调试:

    1.图形化调试

    $ gdb xmain --tui 

    2. 普通调试

    $  gdb xmain

    设置和获取源代码显示数量:
    默认情况下,GDB显示指定位置处以及其前后的10行代码,但是这是一个可设置的值。
    set listsize count:设置list命令显示的源代码数量最多为count行,0表示不限制行数。
    show listsize:显示listsize的值。

     (gdb) list add.cpp:9

    如果显示找不到第九行,则说明当前调试环境没有add.cpp的源码位置,添加add.cpp所在的目录位置即可。

    查看当前环境设置的调试目录:(gdb) show directories

    (gdb) directory ./Libs/

    或者 (gdb) dir ./Libs/

    如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:
    (gdb) break filename:line-number 
    (gdb) break filename:function-name

    在add.cpp的第九行打断点

    (gdb) break add.cpp:9

    Breakpoint 1 at 0x40180e: file add.cpp, line 9.

    (gdb) break line-or-function if expr

    condition bnum: 取消第bnum个breakpoint的条件

    break +offset: 在程序当前停止的行向前offset行处设置breakpoint
    break offset: 在程序当前停止的行向衙offset行处设置breakpoint

    rbreak regex: 在所有符合正则表达式regex的函数处设置breakpoint

    显示当前gdb的断点信息: 
    (gdb) info break

    删除指定的某个断点: 
    (gdb) delete breakpoint 1 
    该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点 
    (gdb) delete breakpoint 
    3.禁止使用某个断点 
    (gdb) disable breakpoint 1 
    该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n 
    4.允许使用某个断点 
    (gdb) enable breakpoint 1 
    该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y 
    5.清除原文件中某一代码行上的所有断点 
    (gdb)clean number 
    注:number 为原文件的某个代码行的行号

    在断点处用display输出a和b的值,以后再断点处会显示变量的值。undisplay取消显示

    (gdb) display a

    (gdb) display a

    (gdb) layout asm (显示汇编)

    (gdb) layout split (同时显示源码和汇编)

    (gdb) r
    Starting program: /home/zhu_ying/GDBMultiFiles/xmain

    Breakpoint 1, CAdd::add (this=0x7fffffffe2d0, a=@0x7fffffffe2dc, b=@0x7fffffffe2d8) at add.cpp:9
    9 int ret = a + b;
    Missing separate debuginfos, use: debuginfo-install libgcc-4.4.7-4.el6.x86_64 libstdc++-4.4.7-4.el6.x86_64

    显示变量的类型:

    (gdb) whatis ret

    ptype:比whatis的功能更强,他可以提供一个结构的定义

    设置变量的值:

    (gdb) set variable a = 30

    (gdb) set variable b = 3

     退出函数:
    (gdb) finish

    终止本次调试:

    (gdb) kill
    Kill the program being debugged? (y or n)

    附加:

     file FILE 装载指定的可执行文件进行调试。

    clear 删除刚才停止处的断点 
    commands 命中断点时,列出将要执行的命令

    (gdb)list

    (gdb) search add
    Expression not found

     有的时候,你会发现search命令总是提示“Expression not found”,这是因为当前行可能已经是最后一行了,特别是文件很短的时候。这里需要注意的是,任何list命令都会影响当前行的位置,并且由于每次都是多行输出,所以对当前行的影响并非简单地向前一行或者向后一行。
              search命令本身也会影响当前行的位置。

    逆向检索add关键字:
    (gdb) reverse-search .*add.*
    7 int CAdd::add(int &a, int &b)

    若第n行被索引到,则下次搜索会从第n行开始。

    跳过断点2之后的5个断点

    (gdb) ignore 2 5

    例如:watch a可以设置观察点watchpoint a,一旦变量a的值发生变化,程序就会停在它发生变化的那个位置

    1. Breakpoint: 作用是让程序执行到某个特定的地方停止运行
    
    (1)设置breakpoint:
    a. break function: 在函数funtion入口处设置breakpoint
    b. break +offset: 在程序当前停止的行向前offset行处设置breakpoint
    c. break –offset: 在程序当前停止的行向衙offset行处设置breakpoint
    d. break linenum: 在当前源文件的第linenum行处设置breakpoint
    e. break filename:linenum: 在名为filename的源文件的第linenum行处设置breakpoint
    f. break filename:function: 在名为filename的源文件中的function函数入口处设置breakpoint
    g. break *address: 在程序的地址address处设置breakpoint
    h. breakif cond: …代表上面讲到的任意一个可能的参数,在某处设置一个breakpoint, 但且仅但cond为true时,程序停下来
    i. tbreak args: 设置一个只停止一次的breakpoints, args与break命令的一样。这样的breakpoint当第一次停下来后,就会被自己删除
    k. rbreak regex: 在所有符合正则表达式regex的函数处设置breakpoint
    
    (2)info breakpoints [n]:
    查看第n个breakpoints的相关信息,如果省略了n,则显示所有breakpoints的相关信息
    
    (3)pending breakpoints:
    是指设置在程序开始调试后加载的动态库中的位置处的breakpoints
    a. set breakpoint pending auto: GDB缺省设置,询问用户是否要设置pending breakpoint
    b. set breakpoint pending on: GDB当前不能识别的breakpoint自动成为pending breakpoint
    c. set breakpoint pending off: GDB当前不能识别某个breakpoint时,直接报错
    d. show breakpoint pending: 查看GDB关于pending breakpoint的设置的行为(auto, on, off)
    
    (4)breakpoints的删除:
    a. clear: 清除当前stack frame中下一条指令之后的所有breakpoints
    b. clear function & clear filename:function: 清除函数function入口处的breakpoints
    c. clear linenum & clear filename:linenum: 清除第linenum行处的breakpoints
    d. delete [breakpoints] [range…]: 删除由range指定的范围内的breakpoints,range范围是指breakpoint的序列号的范围
    
    (5)breakpoints的禁用、启用:
    a. disable [breakpoints] [range…]: 禁用由range指定的范围内的breakpoints
    b. enable [breakpoints] [range…]: 启用由range指定的范围内的breakpoints
    c. enable [breakpoints] once [range…]: 只启用一次由range指定的范围内的breakpoints,等程序停下来后,自动设为禁用
    d. enable [breakpoints] delete [range…]: 启用range指定的范围内的breakpoints,等程序停下来后,这些breakpoints自动被删除
    
    (6)条件breakpoints相关命令:
    a. 设置条件breakpoints可以通过break … if cond来设置,也可以通过condition bnum expression来设置,在这里首先要通过(1)中介绍的命令设置好breakpoints,然后用condition命令来指定某breakpoint的条件,该breakpoint由bnum指定,条件由expression指定
    b. condition bnum: 取消第bnum个breakpoint的条件
    c. ignore bnum count: 第bnum个breakpoint跳过count次后开始生效
    
    (7)指定程序在某个breakpoint处停下来后执行一串命令:
    a. 格式:commands [bnum]
    … command-list …
    end
    b. 用途:指定程序在第bnum个breakpoint处停下来后,执行由command-list指定的命令串,如果没有指定bnum,则对最后一个breakpoint生效
    c. 取消命令列表: commands [bnum]
    end
    d. 例子:
    break foo if x>0
    commands
    silent
    printf “x is %d
    ”,x
    continue
    end
    上面的例子含义:当x>0时,在foo函数处停下来,然后打印出x的值,然后继续运行程序
    
    2. Watchpoint: 它的作用是让程序在某个表达式的值发生变化的时候停止运行,达到‘监视’该表达式的目的
    
    (1)设置watchpoints:
    a. watch expr: 设置写watchpoint,当应用程序写expr, 修改其值时,程序停止运行
    b. rwatch expr: 设置读watchpoint,当应用程序读表达式expr时,程序停止运行
    c. awatch expr: 设置读写watchpoint, 当应用程序读或者写表达式expr时,程序都会停止运行
    
    (2)info watchpoints:
    查看当前调试的程序中设置的watchpoints相关信息
    
    (3)watchpoints和breakpoints很相像,都有enable/disabe/delete等操作,使用方法也与breakpoints的类似
    3. Catchpoint: 的作用是让程序在发生某种事件的时候停止运行,比如C++中发生异常事件,加载动态库事件
    
    (1)设置catchpoints:
    a. catch event: 当事件event发生的时候,程序停止运行,这里event的取值有:
    
    1throw: C++抛出异常
    2catch: C++捕捉到异常
    3)exec: exec被调用
    4)fork: fork被调用
    5)vfork: vfork被调用
    6)load: 加载动态库
    7)load libname: 加载名为libname的动态库
    8)unload: 卸载动态库
    9)unload libname: 卸载名为libname的动态库
    10)syscall [args]: 调用系统调用,args可以指定系统调用号,或者系统名称
    b. tcatch event: 设置只停一次的catchpoint,第一次生效后,该catchpoint被自动删除
    
    (2)catchpoints和breakpoints很相像,都有enable/disabe/delete等操作,使用方法也与breakpoints的类似
     
  • 相关阅读:
    bzoj3997 [TJOI2015]组合数学
    bzoj1143 [CTSC2008]祭祀river
    bzoj 2208 [Jsoi2010]连通数
    bzoj3713 [PA2014]Iloczyn
    bzoj1054 [HAOI2008]移动玩具
    习题6-5 使用函数验证哥德巴赫猜想(20 分)
    习题6-4 使用函数输出指定范围内的Fibonacci数(20 分)
    习题6-3 使用函数输出指定范围内的完数(20 分)
    习题6-2 使用函数求特殊a串数列和(20 分)
    分类统计字符个数(15 分)
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/9093767.html
Copyright © 2011-2022 走看看