gdb_gdbt - CSDN
gdb 订阅
UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。所谓“尺有所短,寸有所长”就是这个道理。 展开全文
UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。所谓“尺有所短,寸有所长”就是这个道理。
信息
类    型
强大的UNIX下的程序调试工具
平    台
UNIX及UNIX-like
发布组织
GNU开源组织
功    能
动态的改变你程序的执行环境等
优    点
具有修复网络断点以及恢复链接等功能
外文名
GDB
gdb功能
一般来说,GDB主要帮助你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
收起全文
精华内容
参与话题
  • Linux gdb调试器用法全面解析

    万次阅读 多人点赞 2019-07-08 18:19:24
    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序。 让被调试的程序在工程师指定的断点处停住,断点...

    更多精华文章请扫描下方二维码关注Linux阅码场

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能:

    • 启动程序,可以按照工程师自定义的要求随心所欲的运行程序。
    • 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。
    • 当程序被停住时,可以检查此时程序中所发生的事,并追索上文。
    • 动态地改变程序的执行环境。

    不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用法都是必须。而且,调试内核和调试应用程序时使用的gdb命令是完全相同的,下面以代码清单22.2的应用程序为例演示gdb调试器的用法。

    
     
    1 int add(int a, int b) 2 { 3 return a + b; 4 } 5 6 main() 7 { 8 int sum[10] = 9 { 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 11 } ; 12 int i; 13 14 int array1[10] = 15 { 16 48, 56, 77, 33, 33, 11, 226, 544, 78, 90 17 }; 18 int array2[10] = 19 { 20 85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4 21 }; 22 23 for (i = 0; i < 10; i++) 24 { 25 sum[i] = add(array1[i], array2[i]); 26 } 27 }

    使用命令gcc –g gdb_example.c –o gdb_example编译上述程序,得到包含调试信息的二进制文件example,执行gdb gdb_example命令进入调试状态:

     

    [root@localhost driver_study]# gdb gdb_example
    GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
    Copyright 2003 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i386-redhat-linux-gnu"...
    (gdb)

     

    1、list命令

    在gdb中运行list命令(缩写l)可以列出代码,list的具体形式包括:

    • list <linenum> ,显示程序第linenum行周围的源程序,如:
    (gdb) list 15
    10        
    11        int array1[10] =
    12        {
    13          48, 56, 77, 33, 33, 11, 226, 544, 78, 90
    14        };
    15        int array2[10] =
    16        {
    17          85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4
    18        };
    19
    • list <function> ,显示函数名为function的函数的源程序,如:
    (gdb) list main
    2       {
    3         return a + b;
    4       }
    5
    6       main()
    7       {
    8         int sum[10];
    9         int i;
    10        
    11        int array1[10] =
    • list,显示当前行后面的源程序。
    • list - ,显示当前行前面的源程序。

    下面演示了使用gdb中的run(缩写r)、break(缩写b)、next(缩写n)命令控制程序的运行,并使用print(缩写p)命令打印程序中的变量sum的过程:

    (gdb) break add
    Breakpoint 1 at 0x80482f7: file gdb_example.c, line 3.
    (gdb) run  
    Starting program: /driver_study/gdb_example 
    
    Breakpoint 1, add (a=48, b=85) at gdb_example.c:3
    warning: Source file is more recent than executable.
    
    3         return a + b;
    (gdb) next
    4       }
    (gdb) next
    main () at gdb_example.c:23
    23        for (i = 0; i < 10; i++)
    (gdb) next
    25          sum[i] = add(array1[i], array2[i]);
    (gdb) print sum
    $1 = {133, 0, 0, 0, 0, 0, 0, 0, 0, 0}gdb) break add
    Breakpoint 1 at 0x80482f7: file gdb_example.c, line 3.
    (gdb) run  
    Starting program: /driver_study/gdb_example 
    
    Breakpoint 1, add (a=48, b=85) at gdb_example.c:3
    warning: Source file is more recent than executable.
    
    3         return a + b;
    (gdb) next
    4       }
    (gdb) next
    main () at gdb_example.c:23
    23        for (i = 0; i < 10; i++)
    (gdb) next
    25          sum[i] = add(array1[i], array2[i]);
    (gdb) print sum
    $1 = {133, 0, 0, 0, 0, 0, 0, 0, 0, 0}

    2、run命令

    在gdb中,运行程序使用run命令。在程序运行前,我们可以设置如下4方面的工作环境:

    • 程序运行参数

    set args 可指定运行时参数,如:set args 10 20 30 40 50;show args 命令可以查看设置好的运行参数。

    • 运行环境

    path <dir> 可设定程序的运行路径;how paths可查看程序的运行路径;set environment varname [=value]用于设置环境变量,如set env USER=baohua;

    show environment [varname]则用于查看环境变量。

    • 工作目录

    cd <dir> 相当于shell的cd命令;pwd 显示当前所在的目录。

    • 程序的输入输出

    info terminal 用于显示程序用到的终端的模式;gdb中也可以使用重定向控制程序输出,如run > outfile;

    tty命令可以指定输入输出的终端设备,如:tty /dev/ttyS1。

    3、break命令

    在gdb中用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>

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

    查看断点时,可使用info命令,如info breakpoints [n]、info break [n](n表示断点号)。

    4、单步命令

    在调试过程中,next命令用于单步执行,类似VC++中的step over。next的单步不会进入函数的内部,与next对应的step(缩写s)命令则在单步执行一个函数时,会进入其内部,类似VC++中的step into。下面演示了step命令的执行情况,在23行的add()函数调用处执行step会进入其内部的“return a+b;”语句:

     

    (gdb) break 25
    Breakpoint 1 at 0x8048362: file gdb_example.c, line 25.
    (gdb) run
    Starting program: /driver_study/gdb_example 
    
    Breakpoint 1, main () at gdb_example.c:25
    25          sum[i] = add(array1[i], array2[i]);
    (gdb) step
    add (a=48, b=85) at gdb_example.c:3
    3         return a + b;

    单步执行的更复杂用法包括:

     

    • step <count>

    单步跟踪,如果有函数调用,则进入该函数(进入函数的前提是,此函数被编译有debug信息)。step后面不加count表示一条条地执行,加表示执行后面的count条指令,然后再停住。

    • next <count>

    单步跟踪,如果有函数调用,它不会进入该函数。同样地,next后面不加count表示一条条地执行,加表示执行后面的count条指令,然后再停住。

    • set step-mode

    set step-mode on用于打开step-mode模式,这样,在进行单步跟踪时,程序不会因为没有debug信息而不停住,这个参数的设置可便于查看机器码。set step-mod off用于关闭step-mode模式。

    • finish

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

    • until (缩写u)

    一直在循环体内执行单步,退不出来是一件令人烦恼的事情,until命令可以运行程序直到退出循环体。

    • stepi(缩写si)和nexti(缩写ni)

    stepi和nexti用于单步跟踪一条机器指令,一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。 另外,运行“display/i $pc”命令后,单步跟踪会在打出程序代码的同时打出机器指令,即汇编代码。

    5、continue命令

    当程序被停住后,可以使用continue命令(缩写c,fg命令同continue命令)恢复程序的运行直到程序结束,或到达下一个断点,命令格式为:

     

    continue [ignore-count]
    c [ignore-count]
    fg [ignore-count]

    ignore-count表示忽略其后多少次断点。 假设我们设置了函数断点add(),并watch i,则在continue过程中,每次遇到add()函数或i发生变化,程序就会停住,如:

     

     

    (gdb) continue
    Continuing.
    Hardware watchpoint 3: i
    
    Old value = 2
    New value = 3
    0x0804838d in main () at gdb_example.c:23
    23        for (i = 0; i < 10; i++)
    (gdb) continue
    Continuing.
    
    Breakpoint 1, main () at gdb_example.c:25
    25          sum[i] = add(array1[i], array2[i]);
    (gdb) continue
    Continuing.
    Hardware watchpoint 3: i
    
    Old value = 3
    New value = 4
    0x0804838d in main () at gdb_example.c:23
    23        for (i = 0; i < 10; i++)

     

    6、print命令

    在调试程序时,当程序被停住时,可以使用print命令(缩写为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:

     

     print <expr>
     print /<f> <expr>


    <expr>是表达式,是被调试的程序中的表达式,<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。在表达式中,有几种GDB所支持的操作符,它们可以用在任何一种语言中,“@”是一个和数组有关的操作符,“::”指定一个在文件或是函数中的变量,“{<type>} <addr>”表示一个指向内存地址<addr>的类型为type的一个对象。

    下面演示了查看sum[]数组的值的过程:

     

    (gdb) print sum
    $2 = {133, 155, 0, 0, 0, 0, 0, 0, 0, 0}
    (gdb) next
    
    Breakpoint 1, main () at gdb_example.c:25
    25          sum[i] = add(array1[i], array2[i]);
    (gdb) next
    23        for (i = 0; i < 10; i++)
    (gdb) print sum
    $3 = {133, 155, 143, 0, 0, 0, 0, 0, 0, 0}

    当需要查看一段连续内存空间的值的时间,可以使用GDB的“@”操作符,“@”的左边是第一个内存地址,“@”的右边则是想查看内存的长度。例如如下动态申请的内存:

     

    int *array = (int *) malloc (len * sizeof (int)); *array = (int *) malloc (len * sizeof (int));

    在GDB调试过程中这样显示出这个动态数组的值:

    p *array@len*array@len

    print的输出格式包括:

    • x 按十六进制格式显示变量。
    • d 按十进制格式显示变量。
    • u 按十六进制格式显示无符号整型。
    • o 按八进制格式显示变量。
    • t 按二进制格式显示变量。
    • a 按十六进制格式显示变量。
    • c 按字符格式显示变量。
    • f 按浮点数格式显示变量。

    我们可用display命令设置一些自动显示的变量,当程序停住时,或是单步跟踪时,这些变量会自动显示。 如果要修改变量,如x的值,可使用如下命令:

    print x=4 x=4

    当用GDB的print查看程序运行时的数据时,每一个print都会被GDB记录下来。GDB会以$1,$2,$3 …这样的方式为每一个print命令编号。我们可以使用这个编号访问以前的表达式,如$1。

    7、watch命令

    watch一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点: watch <expr>:为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。rwatch <expr>:当表达式(变量)expr被读时,停住程序。awatch <expr>:当表达式(变量)的值被读或被写时,停住程序。info watchpoints:列出当前所设置了的所有观察点。 下面演示了观察i并在连续运行next时一旦发现i变化,i值就会显示出来的过程:

     

    (gdb) watch i
    Hardware watchpoint 3: i
    (gdb) next
    23        for (i = 0; i < 10; i++)
    (gdb) next
    Hardware watchpoint 3: i
    
    Old value = 0
    New value = 1
    0x0804838d in main () at gdb_example.c:23
    23        for (i = 0; i < 10; i++)
    (gdb) next
    
    Breakpoint 1, main () at gdb_example.c:25
    25          sum[i] = add(array1[i], array2[i]);
    (gdb) next
    23        for (i = 0; i < 10; i++)
    (gdb) next
    Hardware watchpoint 3: i
    
    Old value = 1
    New value = 2
    0x0804838d in main () at gdb_example.c:23
    23        for (i = 0; i < 10; i++)

     

    8、examine命令

    我们可以使用examine命令(缩写为x)来查看内存地址中的值。examine命令的语法如下所示:

    x/<n/f/u> <addr> /<n/f/u> <addr> 

    <addr>表示一个内存地址。“x/”后的n、f、u都是可选的参数,n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容;f 表示显示的格式,如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i;u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4字节。u参数可以被一些字符代替:b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指定的内存地址开始,读写指定字节,并把其当作一个值取出来。n、f、u这3个参数可以一起使用,例如命令“x/3uh 0x54320”表示从内存地址0x54320开始以双字节为1个单位(h)、16进制方式(u)显示3个单位(3)的内存。 ==

     

    譬如下面的例子:

    main()
    {
            char *c = "hello world";
            printf("%s\n", c);
    }
    


    我们在

    char *c = "hello world";

    下一行设置断点后:

    (gdb) l
    1    main()
    2    {
    3        char *c = "hello world";
    4        printf("%s\n", c);
    5    }
    (gdb) b 4
    Breakpoint 1 at 0x100000f17: file main.c, line 4.
    (gdb) r
    Starting program: /Users/songbarry/main
    Reading symbols for shared libraries +. done
    
    Breakpoint 1, main () at main.c:4
    4        printf("%s\n", c);

    可以通过多种方式看C指向的字符串:

    方法1:

    (gdb) p c
    $1 = 0x100000f2e "hello world"
    

    方法2:

    (gdb) x/s 0x100000f2e
    0x100000f2e:	 "hello world"
    

    方法3:

    (gdb) p (char *)0x100000f2e
    $3 = 0x100000f2e "hello world"

    将第一个字符改为大写:

    (gdb) p *(char *)0x100000f2e='H'
    $4 = 72 'H'
    

    再看看C:

    (gdb) p c
    $5 = 0x100000f2e "Hello world"

     

    9、set命令

     

    修改寄存器:

    (gdb) set $v0 = 0x004000000
    (gdb) set $epc = 0xbfc00000 

    修改内存:

     

    (gdb) set {unsigned int}0x8048a51=0x0
    

    譬如对于第8节的例子:

     

     

    (gdb) set {unsigned int}0x100000f2e=0x0       
    (gdb) x/10cb 0x100000f2e
    0x100000f2e:	0 '\0'	0 '\0'	0 '\0'	0 '\0'	111 'o'	32 ' '	119 'w'	111 'o'
    0x100000f36:	114 'r'	108 'l'
    (gdb) p c
    $10 = 0x100000f2e ""
    

     

     

    10、jump命令

    一般来说,被调试程序会按照程序代码的运行顺序依次执行,但是GDB也提供了乱序执行的功能,也就是说,GDB可以修改程序的执行顺序,从而让程序随意跳跃。这个功能可以由GDB的jump命令:jump <linespec> 来指定下一条语句的运行点。<linespec>可以是文件的行号,可以是file:line格式,也可以是+num这种偏移量格式,表示下一条运行语句从哪里开始。jump <address> 这里的<address>是代码行的内存地址。 注意,jump命令不会改变当前的程序栈中的内容,所以,如果使用jump从一个函数跳转到另一个函数,当跳转到的函数运行完返回,进行出栈操作时必然会发生错误,这可能导致意想不到的结果,所以最好只用jump在同一个函数中进行跳转。

    11、signal命令

    使用singal命令,可以产生一个信号量给被调试的程序,如中断信号“Ctrl+C”。这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB产生一个信号量,这种精确地在某处产生信号的方法非常有利于程序的调试。 signal命令的语法是:signal <signal>,UNIX的系统信号量通常从1到15,所以<signal>取值也在这个范围。

    12、return命令

    如果在函数中设置了调试断点,在断点后还有语句没有执行完,这时候我们可以使用return命令强制函数忽略还没有执行的语句并返回。

     

    return
    return <expression>

    上述return命令用于取消当前函数的执行,并立即返回,如果指定了<expression>,那么该表达式的值会被作为函数的返回值。

     

    13、call命令

    call命令用于强制调用某函数: call <expr> 表达式中可以一是函数,以此达到强制调用函数的目的,它会显示函数的返回值(如果函数返回值不是void)。 其实,前面介绍的print命令也可以完成强制调用函数的功能。

    14、info命令

    info命令可以在调试时用来查看寄存器、断点、观察点和信号等信息。要查看寄存器的值,可以使用如下命令: info registers (查看除了浮点寄存器以外的寄存器)info all-registers (查看所有寄存器,包括浮点寄存器)info registers <regname ...> (查看所指定的寄存器) 要查看断点信息,可以使用如下命令:info break 列出当前所设置的所有观察点,使用如下命令:info watchpoints 查看有哪些信号正在被GDB检测,使用如下命令:info signals info handle 也可以使用info line命令来查看源代码在内存中的地址。info threads可以看多线程。info line后面可以跟行号、函数名、文件名:行号、文件名:函数名等多种形式,例如下面的命令会打印出所指定的源码在运行时的内存地址:

     

    info line tst.c:func

     

    15、set scheduler-locking off|on|step

     

    off 不锁定任何线程,也就是所有线程都执行,这是默认值。
    on 只有当前被调试程序会执行。
    step 在单步的时候,除了next过一个函数的情况以外,只有当前线程会执行。

    与多线程调试相关的命令还包括:

    thread ID
    切换当前调试的线程为指定ID的线程。
     
    break thread_test.c:123 thread all
    在所有线程中相应的行上设置断点
     
    thread apply ID1 ID2 command
    让一个或者多个线程执行GDB命令command。
     
    thread apply all command
    让所有被调试线程执行GDB命令command。

    16、disassemble

    disassemble命令用于反汇编,它可被用来查看当前执行时的源代码的机器码,其实际上只是把目前内存中的指令dump出来。下面的示例用于查看函数func的汇编代码:

    (gdb) disassemble func
    Dump of assembler code for function func:
    0x8048450 <func>:       push   %ebp
    0x8048451 <func+1>:     mov    %esp,%ebp
    0x8048453 <func+3>:     sub    $0x18,%esp
    0x8048456 <func+6>:     movl   $0x0,0xfffffffc(%ebp)
    ...
    End of assembler dump.

    更多精华文章请扫描下方二维码关注Linux阅码场

    展开全文
  • gdb基本命令(非常详细)

    万次阅读 多人点赞 2012-07-10 15:13:08
    gdb基本命令  本文介绍使用gdb调试程序的常用命令。  主要内容:  [简介]  [举例]  [其他]  [简介]  =============  GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在 UNIX...
    
    

    gdb基本命令 

    本文介绍使用gdb调试程序的常用命令。 
    主要内容: 
    [简介] 
    [举例] 
    [其他] 

    [简介] 
    ============= 
    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图形化的调试端。 
    一般来说,GDB主要完成下面四个方面的功能: 
    (1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 
    (2)可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 
    (3)当程序被停住时,可以检查此时你的程序中所发生的事。 
    (4)动态的改变你程序的执行环境。 

    兴趣是最好的老师,这里先整理总结一下在调试的过程中经常遇到的问题。带着这些问题进行学习和实践可以有助于加深印象。 再往后是本人实践过程中总结的常见命令,如有什么问题或者建议,都可以联系我,谢谢!^_^ 
    (1)如何打印变量的值?(print var) 
    (2)如何打印变量的地址?(print &var) 
    (3)如何打印地址的数据值?(print *address) 
    (4)如何查看当前运行的文件和行?(backtrace) 
    (5)如何查看指定文件的代码?(list file:N) 
    (6)如何立即执行完当前的函数,但是并不是执行完整个应用程序?(finish) 
    (7)如果程序是多文件的,怎样定位到指定文件的指定行或者函数?(list file:N) 
    (8)如果循环次数很多,如何执行完当前的循环?(until) 
    (9)多线程如何调试?(???) 

    作者:QuietHeart 
    Email: quiet_heart000@126.com 


    [举例] 
    ============= 
    *启动gdb 
    $gdb 
    这样可以和gdb进行交互了。 

    *启动gdb,并且分屏显示源代码: 
    $gdb -tui 
    这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p. 

    *启动gdb调试指定程序app: 
    $gdb app 
    这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。 

    *启动程序之后,再用gdb调试: 
    $gdb <program> <PID> 
    这里,<program>是程序的可执行文件名,<PID>是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。 

    *启动程序之后,再启动gdb调试: 
    $gdb <PID> 
    这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,<PID>是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。 


    **启动gdb之后的交互命令: 
    交互命令支持[Tab]补全。 

    *显示帮助信息: 
    (gdb) help 

    *载入指定的程序: 
    (gdb) file app 
    这样在gdb中载入想要调试的可执行程序app。如果刚开始运行gdb而不是用gdb app启动的话可以这样载入app程序,当然编译app的时候要加入-g调试选项。 

    *重新运行调试的程序: 
    (gdb) run 
    要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和shell通配符(*、?、[、])在内。 

    *修改发送给程序的参数: 
    (gdb) set args no 
    这里,假设我使用"r yes"设置程序启动参数为yes,那么这里的set args会设置参数argv[1]为no。 

    *显示缺省的参数列表: 
    (gdb) show args 

    *列出指定区域(n1到n2之间)的代码: 
    (gdb) list n1 n2 
    这样,list可以简写为l,将会显示n1行和n2行之间的代码,如果使用-tui启动gdb,将会在相应的位置显示。如果没有n1和n2参数,那么就会默认显示当前行和之后的10行,再执行又下滚10行。另外,list还可以接函数名。 
    一般来说在list后面可以跟以下这们的参数: 
    <linenum>   行号。 
    <+offset>   当前行号的正偏移量。 
    <-offset>   当前行号的负偏移量。 
    <filename:linenum>  哪个文件的哪一行。 
    <function>  函数名。 
    <filename:function> 哪个文件中的哪个函数。 
    <*address>  程序运行时的语句在内存中的地址。 

    *执行下一步: 
    (gdb) next 
    这样,执行一行代码,如果是函数也会跳过函数。这个命令可以简化为n. 

    *执行N次下一步: 
    (gdb) next N 

    *执行上次执行的命令: 
    (gdb) [Enter] 
    这里,直接输入回车就会执行上次的命令了。 

    *单步进入: 
    (gdb) step 
    这样,也会执行一行代码,不过如果遇到函数的话就会进入函数的内部,再一行一行的执行。 

    *执行完当前函数返回到调用它的函数: 
    (gdb) finish 
    这里,运行程序,直到当前函数运行完毕返回再停止。例如进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish. 

    *指定程序直到退出当前循环体: 
    (gdb) until 
    或(gdb) u 
    这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。 

    *跳转执行程序到第5行: 
    (gdb) jump 5 
    这里,可以简写为"j 5"需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。 
    另外,跳转不会改变当前的堆栈内容,所以跳到别的函数中就会有奇怪的现象,因此最好跳转在一个函数内部进行,跳转的参数也可以是程序代码行的地址,函数名等等类似list。 

    *强制返回当前函数: 
    (gdb) return 
    这样,将会忽略当前函数还没有执行完毕的语句,强制返回。return后面可以接一个表达式,表达式的返回值就是函数的返回值。 

    *强制调用函数: 
    (gdb) call <expr> 
    这里,<expr>可以是一个函数,这样就会返回函数的返回值,如果函数的返回类型是void那么就不会打印函数的返回值,但是实践发现,函数运行过程中的打印语句还是没有被打印出来。 

    *强制调用函数2: 
    (gdb) print <expr> 
    这里,print和call的功能类似,不同的是,如果函数的返回值是void那么call不会打印返回值,但是print还是会打印出函数的返回值并且存放到历史记录中。 

    *在当前的文件中某一行(假设为6)设定断点: 
    (gdb) break 6 

    *设置条件断点: 
    (gdb) break 46 if testsize==100 
    这里,如果testsize==100就在46行处断点。 

    *检测表达式变化则停住: 
    (gdb) watch i != 10 
    这里,i != 10这个表达式一旦变化,则停住。watch <expr> 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序(也是一种断点)。 

    *在当前的文件中为某一函数(假设为func)处设定断点: 
    (gdb) break func 

    *给指定文件(fileName)的某个行(N)处设置断点: 
    (gdb) break fileName:N 
    这里,给某文件中的函数设置断点是同理的。 

    *显示当前gdb断点信息: 
    (gdb) info breakpoints 
    这里,可以简写为info break.会显示当前所有的断点,断点号,断点位置等等。 

    *删除N号断点: 
    (gdb) delete N 

    *删除所有断点: 
    (gdb) delete 

    *清除行N上面的所有断点: 
    (gdb) clear N 


    *继续运行程序直接运行到下一个断点: 
    (gdb) continue 
    这里,如果没有断点就一直运行。 

    *显示当前调用函数堆栈中的函数: 
    (gdb) backtrace 
    命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。当然,这里也会显示出当前运行到了哪里(文件,行)。 

    *查看当前调试程序的语言环境: 
    (gdb) show language 
    这里,如果gdb不能识别你所调试的程序,那么默认是c语言。 

    *查看当前函数的程序语言: 
    (gdb) info frame 

    *显示当前的调试源文件: 
    (gdb) info source 
    这样会显示当前所在的源代码文件信息,例如文件名称,程序语言等。 

    *手动设置当前的程序语言为c++: 
    (gdb) set language c++ 
    这里,如果gdb没有检测出你的程序语言,你可以这样设置。 

    *查看可以设置的程序语言: 
    (gdb) set language 
    这里,使用没有参数的set language可以查看gdb中可以设置的程序语言。 

    *终止一个正在调试的程序: 
    (gdb) kill 
    这里,输入kill就会终止正在调试的程序了。 

    *print显示变量(var)值: 
    (gdb) print var 
    这里,print可以简写为p,print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含函数调用,复杂数据结构和历史等等。 

    *用16进制显示(var)值: 
    (gdb) print /x var 
    这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。 
    可以支持的变量显示格式有: 
    x  按十六进制格式显示变量。 
    d  按十进制格式显示变量。 
    u  按十六进制格式显示无符号整型。 
    o  按八进制格式显示变量。 
    t  按二进制格式显示变量。 
    a  按十六进制格式显示变量。 
    c  按字符格式显示变量。 
    f  按浮点数格式显示变量。 


    *如果a是一个数组,10个元素,如果要显示则: 
    (gdb) print *a@10 
    这样,会显示10个元素,无论a是double或者是int的都会正确地显示10个元素。 

    *修改运行时候的变量值: 
    (gdb) print x=4 
    这里,x=4是C/C++的语法,意为把变量x值改为4,如果你当前调试的语言是Pascal,那么你可以使用Pascal的语法:x:=4。 

    *显示一个变量var的类型: 
    (gdb) whatis var 

    *以更详细的方式显示变量var的类型: 
    (gdb) ptype var 
    这里,会打印出var的结构定义。 

    [其他] 
    ============= 
    *在Qt4.x环境中打印QString msg;的msg变量: 
    步骤如下: 
    1)定义一个宏printqstring 
    define printqstring 
        printf "(QString)0x%x (length=%i): \"",&$arg0,$arg0.d->size 
        set $i=0 
        while $i < $arg0.d->size 
            set $c=$arg0.d->data[$i++] 
            if $c < 32 || $c > 127 
                    printf "\\u0x%04x", $c 
            else 
                    printf "%c", (char)$c 
            end 
        end 
        printf "\"\n" 
    end 
    2)(gdb) printqstring msg 
    这里,这个宏可以在gdb中直接定义,据说也可以写到$HOME/.gdbinit,这样每次启动自动加载。 

    *调试同时指明生成core文件: 
    $gdb <program> core 
    用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。当程序非法崩溃的时候会产生一个core文件,然后使用这个命令,会直接定位到发生程序崩溃的位置。注意:有时需要设置系统命令“ulimit -c unlimited”才能产生core文件。 


    **没有实践过的 
    *print显示存储块,如显示h后面的10个整数: 
    print h@10 
    ** 
    展开全文
  • LINUX下GDB的使用方法(简单说说)

    万次阅读 多人点赞 2019-08-02 12:47:17
    ##LINUX下GDB的使用方法 简单说说GDB的用法,请赐教,诸君,拔剑吧! 1.什么是GDB,能干啥?  gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。  一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动...
    LINUX下GDB的使用方法
    简单说说GDB的用法,请赐教,诸君,拔剑吧!

    1.什么是GDB,能干啥?
     gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。

     一般来说,GDB主要帮助你完成下面四个方面的功能:

    1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

    2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

    3、当程序被停住时,可以检查此时你的程序中所发生的事。

    4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

    (来自百度百科)
    2.GDB调试的对象
     GDB主要来调试C/C++语言写的程序,当然也就可以调试其他语言程序。这里我们只说C/C++(其他语言我也不会呀)
    GDB调试一定要是可执行文件而不是.c文件
    要用gcc进行编译,具体的命令如下:

    gcc -g 源文件.c -o 输出的目标文件

    -g,-o参数缺一不可


    3.GDB常用的调试命令
    一大波命令来袭,hold,或者jump
    (gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h

    (gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r

    (gdb)start:单步执行,运行程序,停在第一执行语句

    (gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l

    (gdb)set:设置变量的值

    (gdb)next:单步调试(逐过程,函数直接执行),简写n

    (gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s

    (gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt

    (gdb)frame:切换函数的栈帧,简写f

    (gdb)info:查看函数内部局部变量的数值,简写i

    (gdb)finish:结束当前函数,返回到函数调用点

    (gdb)continue:继续运行,简写c

    (gdb)print:打印值及地址,简写p

    (gdb)quit:退出gdb,简写q

    (gdb)break+num:在第num行设置断点,简写b

    (gdb)info breakpoints:查看当前设置的所有断点

    (gdb)delete breakpoints num:删除第num个断点,简写d

    (gdb)display:追踪查看具体变量值

    (gdb)undisplay:取消追踪观察变量

    (gdb)watch:被设置观察点的变量发生修改时,打印显示

    (gdb)i watch:显示观察点

    (gdb)enable breakpoints:启用断点

    (gdb)disable breakpoints:禁用断点

    (gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元

    (gdb)run argv[1] argv[2]:调试时命令行传参

    以上就是GDB的命令其中的部分,下面列详细写一些基础常用的命令:
     **list **
    list 可写为l,可以列出所调试程序的代码

    1.list+linenumber
    可以列出linenumber附近的代码
    2.list function
    可以列出函数上下文的源程序

    run&quit
    

    在GDB中如何将程序运行起来,此时只要输入run命令,就可以将命令跑起来
    而quit则是退出GDB调试
    break

    gdb调试时使用break命令来设置断点,有如下几种下断点地方法

    break < function > 
    

    在进入指定的函数function时既停止运行,C++中可以使用class::function或function(type, type)格式来指定函数名称

    break < lineNumber> 
    

    在指定的代码行打断点

    break +offset/break -offset 
    

    在当前行的前面或后面的offset行打断点,offset为自然数

    break filename:lineNumber 
    

    在名称为filename的文件中的第lineNumber行打断点

    break filename:function 
    

    在名称为filename的文件中的function函数入口处打断点

    break *address 
    

    在程序运行的内存地址处打断点

    break 
    

    在下一条命令处停止运行

    break … if < condition> 
    

    在处理某些循环体中可使用此方法进行调试,其中…可以是上述的break lineNumber

    break +offset/break -offset中的参数,其中condition表示条件,在条件成立时程
    序即停止运行,如设置break if i=100表示当i为100时程序停止运行。

    查看断点时,也可以使用info命令如info breakpoints [n]、info break [n]其中n 表示断点号来查看断点信息。

    可以通过delete命令删除所有的断点
    next
    使用next命令单步执行程序代码,next的单步不会进入函数的内部,与next对应的step命令则在单步执行一个函数时进入函数内部,类似于VC++中的step into.
    其用法如下

    next <count> 
    

    单步跟踪,如果有函数调用不会进入函数,如果后面不加count表示一条一条的执行,加count表示执行后面的count条指令

    continue
    

    当程序遇到断点停下来之后,可以执行continue继续执行到下一个断点或到程序结束

    print
    
    print可以缩写为p,可以通过print命令查看参数或程序运行数据
    

    值得注意的是print输出可以指定输出格式:

    x按16进制格式显示变量
    
    d按十进制显示变量
    
    u按十六进制格式显示无符号整形
    
    o按八进制格式显示变量
    
    t按二进制格式显示变量
    
    c按字符格式显示变量
    
    f按浮点数格式显示变量 
    

    GDB查看,执行汇编语言
    查看汇编 disassemble

    下面就是查看的汇编代码

    那么我如果要是在红箭头出进行下断如何下?


    还有这种随源码一起排列的,是不是很直观:

    再补充几条命令
    backtrace(直译回溯)(bt)

    当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用这条命令来查看当前的栈中的所有信息。人为的将程序下断停住,直接上图:

    bt n
    

    显示栈顶的几个层的信息

    bt -n
    

    显示栈底下的几层信息

    but,如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。(就有了下面这条命令)

    frame(帧)(f)
    
    f
    

    n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。

    up
    

    表示向栈的上面移动n层,可以不打n,表示向上移动一层。

    down
    

    表示向栈的下面移动n层,可以不打n,表示向下移动一层。

    info f
    

    会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内
    地址

    (以下讲解没有截图,为避免审美疲劳,请适度观看)

    **print**(p)
    

     可以输出东西可多,全局变量,静态全局变量,局部变量,

     如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。
    查看全局变量,利用::,例如在1.c中看x

    gdb)p "1.c"::x
    

    数组(动)

    p *array@len
    

    array:数组的首地址,len:数据的长度
    (gdb) p *array@len
    $1 = {1, 2, 3, 4, 5}
    (静)
    直接p数组名

    所有寄存器的值

    info registers
    

    查看指定的寄存器的值

    p $eip
    

    结构体
    如果你想很漂亮的输出结构体请设置

    set print pretty on
    

    打开print pretty这个东西,没错,输出很漂亮滴,
    在这里插入图片描述
    总而言之,p很强大,只要你想输出。

    展开全文
  • GDB 详细介绍

    2019-01-14 12:03:28
    5.1.1设置断点 使用break命令(缩写 b)设置断点。调试器便利变量’$ bpnum’记录您最近设置的断点数; 有关便利变量的讨论,请参阅便利变量。 break location 在给定位置设置断点,可以指定函数名称,行号或指令的...

    5.1.1设置断点
    使用break命令(缩写 b)设置断点。调试器便利变量’$ bpnum’记录您最近设置的断点数; 有关便利变量的讨论,请参阅便利变量。

    break location
    在给定位置设置断点,可以指定函数名称,行号或指令的地址。(有关指定位置的所有可能方法的列表,请参阅“ 指定位置”。)断点将在执行指定位置中的任何代码之前停止程序。

    当使用允许重载符号的源语言(例如C ++)时,函数名称可能引用多个可能的中断位置。有关该情况的讨论,请参阅模糊表达式。

    只有当特定线程(请参阅特定于线程的断点)或特定任务(请参阅Ada任务)命中该断点时,才可以插入一个断点来停止程序。

    break
    在没有任何参数的情况下调用时,break在要在所选堆栈帧中执行的下一条指令处设置断点(请参阅检查堆栈)。在任何选定的帧中,但在最里面,这使得程序在控制返回到该帧时立即停止。这类似于finish所选帧内帧中命令的效果 - 除了finish不会留下活动断点。如果你break在最里面的框架中没有参数使用 ,GDB会在下次到达当前位置时停止; 这在循环内部可能很有用。

    GDB通常在恢复执行时忽略断点,直到至少执行了一条指令。如果它没有这样做,你将无法在没有首先禁用断点的情况下继续通过断点。无论在程序停止时断点是否已存在,此规则都适用。

    break … if cond
    设置条件为cond的断点; 每次到达断点时计算表达式 cond,并且仅当值为非零时停止 - 即,如果cond计算为true。“…'代表上面描述的一个可能的参数(或没有参数)指定中断的位置。有关断点条件的详细信息,请参阅中断条件。

    tbreak args
    设置仅为一站启用的断点。该ARGS是相同的break命令,并且断点以同样的方式设置,但断点在第一次程序中断后自动删除。请参阅禁用断点。

    hbreak args
    设置硬件辅助断点。该ARGS是相同的 break命令和断点以同样的方式设置,但断点需要硬件支持,某些硬件可能不支持此功能。其主要用途是EPROM / ROM代码调试,因此您可以在不更改指令的情况下在指令处设置断点。这可以与SPARClite DSU和大多数基于x86的目标提供的新陷阱生成一起使用。当程序访问分配给调试寄存器的某些数据或指令地址时,这些目标将生成陷阱。但是,硬件断点寄存器可以占用有限数量的断点。例如,在DSU上,一次只能设置两个数据断点和 GDB如果使用两个以上,将拒绝此命令。在设置新的断点之前删除或禁用未使用的硬件断点(请参阅禁用断点)。见破裂条件。对于远程目标,您可以限制GDB将使用的硬件断点数,请参阅set remote hardware-breakpoint-limit。

    thbreak args
    设置仅在一次停止时启用的硬件辅助断点。该ARGS 是相同的hbreak命令和断点以同样的方式设置。但是,与tbreak命令一样,断点会在程序第一次停止后自动删除。此外,与hbreak 命令一样,断点需要硬件支持,而某些目标硬件可能没有此支持。请参阅禁用断点。另见休息条件。

    rbreak regex
    在与正则表达式正则表达式匹配的所有函数上设置断点 。此命令在所有匹配项上设置无条件断点,打印其设置的所有断点的列表。设置这些断点后,它们将被视为与使用该break命令设置的断点一样。您可以删除它们,禁用它们,或者以与任何其他断点相同的方式使它们成为条件。

    正则表达式的语法是与工具一样使用的标准语法 grep的。请注意,这与shell使用的语法不同,因此例如foo*匹配包含fo后跟零或更多os的所有函数。隐式 .*前导和尾随您提供的正则表达式,因此要仅匹配以…开头的函数foo,请使用^foo。

    在调试C ++程序时,rbreak对于不是任何特殊类的成员的重载函数设置断点非常有用。

    该rbreak命令可用于在程序的所有函数中设置断点 ,如下所示:

    (gdb)rbreak。
    rbreak file:regex
    如果rbreak使用文件名限定调用,则会将搜索与给定正则表达式匹配的函数限制为指定文件。例如,这可以用于在给定文件中的每个函数上设置断点:

    (gdb)rbreak file.c:。
    将文件名限定符与正则表达式分隔开的冒号可以可选地用空格包围。

    info breakpoints [list…]
    info break [list…]
    打印设置和未删除的所有断点,观察点和捕获点的表。可选参数n表示仅打印有关指定断点(或观察点或捕获点)的信息。对于每个断点,将打印以下列:

    断点数
    类型
    断点,观察点或接近点。

    性格
    是否将断点标记为禁用或在命中时删除。

    已启用或已禁用
    启用的断点标记为’ÿ”。“ñ’标记未启用的断点。

    地址
    断点位于程序中的位置,作为内存地址。对于尚未知道其地址的挂起断点,此字段将包含’”。在加载具有断点引用的符号或行的共享库之前,不会触发此类断点。请参阅下文了解详情。有几个地点的断点将有’'在这个领域 - 详见下文。

    什么
    断点位于程序源中的位置,作为文件和行号。对于挂起的断点,将列出传递给断点命令的原始字符串,因为在将来加载相应的共享库之前,该字符串无法解析。

    如果断点是有条件的,则有两种评估模式:“host”和“target”。如果mode是“host”,则断点条件评估由 GDB在主机端完成。如果是“目标”,则由目标评估条件。该info break命令显示受影响的断点后面的行上的条件,以及括号内的条件评估模式。

    之后会列出断点命令(如果有)。允许挂起的断点具有为其指定的条件。在加载共享库以允许挂起的断点解析为有效位置之前,不会解析条件的有效性。

    info break断点号为n的参数仅列出该断点。方便变量$_和x命令的默认检查地址设置为列出的最后一个断点的地址(请参阅检查内存)。

    info break显示断点被击中的次数。这与ignore命令结合使用时尤其有用 。您可以忽略大量的断点命中,查看断点信息以查看断点被击中的次数,然后再次运行,忽略少于该数量的断点。这将使您快速到达该断点的最后一击。

    对于启用计数(xref)大于1的断点, info break也会显示该计数。

    GDB允许您在程序的同一位置设置任意数量的断点。这没有什么愚蠢或毫无意义的。当断点是有条件的时,这甚至是有用的(参见中断条件)。

    断点可能对应于程序中的多个位置。这种情况的例子是:

    程序中的多个函数可能具有相同的名称。
    对于C ++构造函数,GCC编译器生成函数体的多个实例,在不同情况下使用。
    对于C ++模板函数,函数中的给定行可以对应于任意数量的实例化。
    对于内联函数,给定的源代码行可以对应于内联函数的几个位置。
    在所有这些情况下,GDB将在所有相关位置插入断点。

    断点表中使用多个行(一个标题行)显示具有多个位置的断点,每个断点位置后跟一行。标题行有’'在地址栏中。各个位置的行包含位置的实际地址,并显示这些位置所属的功能。位置的数字列的形式为 断点号。位置号码。

    例如:

    Num Type Disp Enb地址什么
    1个断点保持y
    只有当i == 1时才停止
    断点已经打了一次
    1.1 y 0x080486a2 in void foo ()at t.cc:8
    1.2 y 0x080486ca in void foo ()at t.cc:8
    您无法从断点删除各个位置。但是,可以通过传递断点号来单独启用或禁用每个位置 。location-number作为enable和disable命令的参数 。它也可以以 enable与disable一个范围的位置的数目 使用位置断点数和两个位置的数目 S,按递增顺序,用连字符分开,如 ,在这种情况下GDB(含)作用于范围中的所有位置。禁用或启用父断点(请参阅禁用)会影响属于该断点的所有位置。 breakpoint-number.location-number1-location-number2

    在共享库中有一个断点是很常见的。可以在执行程序时显式地并且可能重复地加载和卸载共享库。为了支持此用例,GDB会在加载或卸载任何共享库时更新断点位置。通常,您可以在调试会话开始时,未加载库时以及库中的符号不​​可用时在共享库中设置断点。当您尝试设置断点时,GDB将询问您是否要设置所谓的挂起断点 -断点,其地址尚未解析。

    运行程序后,无论何时加载新的共享库, GDB都会重新评估所有断点。当新加载的共享库包含某个挂起断点引用的符号或行时,该断点将被解析并成为普通断点。卸载库时,引用其符号或源行的所有断点都将再次挂起。

    此逻辑也适用于具有多个位置的断点。例如,如果C ++模板函数中有断点,并且新加载的共享库具有该模板的实例化,则会将新位置添加到断点的位置列表中。

    除了具有未解析的地址之外,挂起的断点与常规断点没有区别。您可以设置条件或命令,启用和禁用它们以及执行其他断点操作。

    GDB提供了一些额外的命令来控制’'时发生的事情打破’命令无法将断点地址规范解析为地址:

    set breakpoint pending auto
    这是默认行为。当GDB找不到断点位置时,它会查询是否应创建挂起断点。

    set breakpoint pending on
    这表示无法识别的断点位置应自动导致创建挂起的断点。

    set breakpoint pending off
    这表示不创建挂起的断点。任何无法识别的断点位置都会导致错误。此设置不会影响先前创建的任何挂起断点。

    show breakpoint pending
    显示用于创建挂起断点的当前行为设置。

    上述设置仅影响break命令及其变体。一旦设置了断点,它将在加载和卸载共享库时自动更新。

    对于某些目标,GDB可以自动决定是否应使用硬件或软件断点,具体取决于断点地址是只读还是读写。这适用于使用该break命令设置的断点以及由next和等命令设置的内部断点finish。对于设置的断点hbreak,GDB将始终使用硬件断点。

    您可以使用以下命令控制此自动行为:

    set breakpoint auto-hw on
    这是默认行为。当GDB设置断点时,它将尝试使用目标内存映射来决定是否必须使用软件或硬件断点。

    set breakpoint auto-hw off
    这表明GDB不应自动选择断点类型。如果目标提供内存映射,GDB将在尝试将软件断点设置为只读地址时发出警告。

    GDB通常通过使用特殊指令替换断点地址处的程序代码来实现断点,该指令在执行时将控制权交给调试器。默认情况下,只有在程序恢复时才会修改程序代码。程序一停止,GDB就会恢复原始指令。如果gdb abrubptly断开连接,此行为可防止在目标中插入断点。但是,对于慢速远程目标,插入和删除断点会降低性能。可以使用以下命令控制此行为::

    set breakpoint always-inserted off
    所有断点(包括用户新添加的断点)仅在目标恢复时才会插入目标。停止时,所有断点都将从目标中删除。这是默认模式。

    set breakpoint always-inserted on
    导致所有断点始终插入目标。如果用户添加新断点或更改现有断点,则会立即更新目标中的断点。仅当断点本身被删除时,才会从目标中删除断点。

    GDB通过在断点中断时评估这些条件来处理条件断点。如果条件为真,则正在调试的进程停止,否则恢复进程。

    如果目标支持在其结束时评估条件,GDB可以将断点及其条件下载到它。

    可以通过以下命令控制此功能:

    set breakpoint condition-evaluation host
    此选项命令GDB评估主机端的断点条件。无条件断点被发送到目标,目标接收触发器并将它们报告回GDB以进行条件评估。这是标准评估模式。

    set breakpoint condition-evaluation target
    此选项命令GDB在插入时将断点条件下载到目标。目标负责评估条件表达式,并在条件为真时将断点停止事件报告回GDB。由于目标方评估的限制,在那里无法评估某些条件,例如,依赖于仅为主机所知的本地数据的条件。示例包括涉及便利变量的条件表达式,代理表达式解析器无法处理的复杂类型以及太长而无法发送到目标的表达式,特别是当目标是远程系统时。在这些情况下,条件将由GDB评估。

    set breakpoint condition-evaluation auto
    这是默认模式。如果目标支持在其末端评估断点条件,GDB将向目标下载断点条件(前面提到的限制适用)。如果目标不支持断点条件评估,那么GDB将回退到评估主机端的所有这些条件。

    展开全文
  • 使用gdb调试程序完全教程

    万次阅读 多人点赞 2016-06-14 14:37:07
    程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,...分析现象 -> 假设错误原因 -> 产生新的现象去验证假设调试器(如GDB)的目的是允许你在程序运行时进入到某个程序内部去看看该程序在做什么,或者
  • gdb中x的用法

    万次阅读 2020-05-18 23:40:22
    gdb查看内存 格式: x /nfu 说明 x 是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, 可取如下值 x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十进制格式显示无符号整型。 o 按八进制...
  • gdb 调试入门,大牛写的高质量指南

    万次阅读 2018-03-23 16:49:29
    转载地址: http://blog.jobbole.com/107759/没想到Brendan Gregg...但可能正如文章开头所说,大牛对网上的gdb文章都不太满意,所以才有了这篇高质量指南,gdb入门者的福音。—— 何登成如果你是系统管理员,但还...
  • gdb 的用法

    万次阅读 2017-01-30 20:43:44
    gdb 的用法 在Linux应用程序开发中,最常用的调试器是gdb,它可以在程序中设置断点、查看变量值、一步一步跟踪程序的执行过程。利用调试器的这些功能可以方便地找出程序中存在的非语法错误。 一、启动和退出gdb ...
  • gdb调试的基本使用

    万次阅读 多人点赞 2018-04-27 00:19:25
    GDB调试 启动程序准备调试 GDB yourpram 或者 先输入GDB 然后输入 file yourpram 然后使用run或者r命令开始程序的执行,也可以使用 run parameter将参数传递给该程序 参数列表 命令 ...
  • GDB

    千次阅读 2019-08-13 16:47:23
    1.GDB GDB(the GNU Project Debugger)是 GNU 发布的一个功能强大的 UNIX 程序调试工具,可以调试 Ada、C、C++、Objective-C 和 Pascal 等多种语言的程序,可以在大多数 UNIX 和Microsoft Windows 变种上运行。GDB...
  • GDB - 简单易上手的新人教程

    万次阅读 2018-07-23 15:56:22
    什么是GDB GDB, 又称GNU调试器,是用来帮助调试我们程序的工具。 GDB可以干以下几件事: 1. 给程序设置(特定条件下的)断点 2. 当程序停在断点处时,我们查看所有变量、寄存器的值 3. 当程序停在断点处时,...
  • gdb进入和退出

    万次阅读 2017-10-11 09:15:27
    进入gdb调试程序时,有几种方法可以在gdb下运行你的程序: gdb {你的程序} 进入gdb后,输入run(简写r) {arg1} {arg2} … {argN} gdb –args {你的程序} {arg1} {arg2} … {argN} 进入gdb后,运行run。 gdb进入gdb后...
  • gdb 打印所有线程堆栈

    万次阅读 2017-01-05 15:58:31
    gdb 打印所有线程堆栈 在gdb中使用 thread apply all bt 查看所用线程堆栈信息
  • linux下gdb的安装及查看方法

    万次阅读 2018-03-02 16:26:39
    linux下gdb的安装方法gdb是Linux环境下的代码调试工具,其安装步骤如下:安装step1:首先检查系统中有没有安装过,有的话用一下命令卸载gdb旧版本step2:在网址:http://ftp.gnu.org/gnu/gdb下载gdb源码包(这里楼主...
  • gdb调试常用命令

    万次阅读 2016-12-15 14:00:50
    gcc -g main.c //在目标...gdb a.out(gdb) start //开始调试 (gdb) n //一条一条执行 (gdb) step/s //执行下一条,如果函数进入函数 (gdb) backtrace/bt //查看函数调用栈帧 (gdb) info/i locals //查看当前栈帧局部
  • gdb 里设置临时变量

    万次阅读 2015-01-20 14:54:44
    (gdb) set $i="hello" (gdb) ptype $i type = char [6] (gdb) set $i=1 (gdb) ptype $i type = int (gdb) set $i=(char)1 (gdb) ptype $i type = char (gdb) set $i=(short)1 (gdb) ptype $i
  • gdb设置条件断点

    万次阅读 2013-03-18 15:36:05
    转自:... 要想设置一个条件断点,可以利用break if命令,如下所示:  (gdb) break line-or-function if expr  ...(gdb) break 46 if testsize==100
  • 为MinGW安装GDB

    万次阅读 2010-08-04 17:06:00
    为MinGW安装GDB MinGW的默认安装是不带GDB调试器的,本文介绍为MinGW安装GDB。前提:安装好MinGW,但是它是不带GDB调试器的。安装步骤:1. 从“https://sourceforge.net/projects/mingw/”处下载GDB,当前的版本是...
  • Windows下安装GDB

    万次阅读 2014-08-29 16:17:24
    昨天下了个GNU,里面没包含
  • gdb 调试时指定跳到第几行

    万次阅读 2014-10-14 13:10:12
    转自:http://www.toptip.ca/2010/06/gdb-skip-instructions-or-lines-while.html
1 2 3 4 5 ... 20
收藏数 105,908
精华内容 42,363
关键字:

gdb