GDB 调试指令

1. 列出源程序

1.1 不带参数的list命令:   (gdb) list 或 l

1.2 带一个参数的list命令:(gdb) list <line-number>

1.3 带两个参数的list命令:(gdb) list <line1, line2> 参数line1为显示的起始行,line2为结束行

2. 运行程序命令:(gdb) run <arg1 arg2 ...> 或 (gdb) r <arg1 arg2 ...>

3. 操作断点的命令

3.1 设置断点:

      1. 在源程序中指定的行上设置断点:(gdb) break <line-number> 或 (gdb) b <line-number>

      2. 在指定的函数前设置断点:(gdb) break <function-name> 或 b <function-name>

      3. 使用表达式设置断点:break <line-number/function-name> if <conditional expression>

                                     <line-number>为设置断点的行号,也可以是函数名。<conditional expression>为表达式,如果表达式为真,程序到达

                                    指定行或函数时停止。表达式只要符合使用语言的语法即可,当调试C程序时断点条件可以是任何合法的C表达式。

                                     注意:在条件中指定的变量必须在设置断点的行的变量作用域范围内,否则,这个表达式就没有意义。

      4. 在指定例程的入口处设置断点

           如果该程序是由很多源文件构成的,则可以在各个源文件中设置断点:

           (gdb) break <filename: line-number/function-name>

3.2 显示当前gdb的断点信息

       (gdb) info break

3.3 删除指定的断点

       (gdb) delete breakpoint <point-number>

3.4 禁止或启用断点

       (gdb) enable breakpoint  <point-number>

       (gdb) disable breakpoint <point-number>

       enable 和 disable 命令用来设置断点的可用属性,但禁用并不代表删除断点,使用info break命令依然可以查看到断点信息。

3.5 清除断点

      不带参数的clear命令:(gdb) clear

      带参数的clear命令:(gdb) clear <number>

3.6 观察点

      watch <condition>:在程序中设置一个观察点(即数据断点),<condition>是出发观察点的条件,一旦触发会导致gdb中断。

 

4. 查看运行时数据

4.1 数据观察命令

      利用print命令可以检查各个变量的

      (gdb) print <variable-name> 或 (gdb) p <variable-name>

      (gdb) print <file::variable>

      (gdb) print <function::variable>

4.2 对程序中函数的调用

      (gdb) print func(arg1, arg2, ...):对程序中的函数进行调用,并在调用时指定形参的值。

4.3 查看表达式的值

      (gdb) print <expression>

4.4 查看数组的值

      (gdb) print <array-name>

4.5 变量的输出格式

      (gdb) print/? <variable>

      数据显示格式:x:按十六进制格式显示变量

                              d:按十进制格式显示变量

                              u:按十六进制格式显示无符号整型

                              o:按八进制格式显示变量

                              t:按二进制格式显示变量

                              a:按十六进制格式显示变量

                              e:按字符格式显示变量

                              f:按浮点数格式显示变量

4.6 查看内存

      (gdb) examine /nfu <address> 或 (gdb) x /nfu <address>

      n是一个正整数,表示显示内存的长度,即指定从当前地址向后显示几个单位的内容(一个单位等于几个字节由u参数指定)。

      f表示显示的格式,参见变量输出格式的参数定义。如果地址所指的是字符串,那么格式可以使s。如果是指令地址,那么格式可以是i。

      u表示从当前地址向后请求的字节数。如果不指定,gdb默认是4个B。u参数可以用下面的字符代替,b表示单字节,h表示双字节,w表示四

         字节,g表示八字节。

4.7 自动显示变量

       (gdb) display /fmt expr:expr是一个表达式,fmt表示显示的格式(和命令examine的参数一样),当用display设定好了一个或多个表达式后,程序一旦停止,gdb会自动显示所设置的表达式的值。

       (gdb) info display

       (gdb) undisplay

       (gdb) delete display <dnums>

       (gdb) disable display <dnums>

       (gdb) enable display <dnums>

       (gdb) disable display

       (gdb) enable display

4.8设置显示选项

       (gdb) set print address on/off

       (gdb) show print address

       (gdb) set print arrray on/off

       (gdb) show print array

       (gdb) set elements on/off

       (gdb) show print elements

       (gdb) set print null-stop on/off

       (gdb) show print null-stop

       (gdb) set print pretty on/off

       (gdb) show print pretty

       (gdb) set print sevenbit-strings on/off

       (gdb) show print union

       (gdb) set print object on/off

       (gdb) show print object

       (gdb) set print static-memebers on/off

       (gdb) show print static-members

       (gdb) set print vtbl on/off

       (gdb) show print vtbl

4.9 显示变量的历史记录

      当使用gdb的print查看程序运行时的数据时,每一个print都会被gdb记录下来。gdb会以$1, $2, $3, ......这样的方式为每一个print命令结果

      编号。这样就可以使用这个编号访问以前的表达式。

4.10 查看寄存器

      (gdb) info registers

      (gdb) info all-registers

      (gdb) info registers <register-name>

4.11 查看使用gdb环境变量

      (gdb) set <expression>

        (gdb) show convenience

 

5. 改变程序的执行

5.1 修改变量的值

       (gdb) print <expr>

       (gdb) set <expr>

       (gdb) set var <expr>:set var命令告诉gdb,程序中的变量名

5.2 跳转执行

       (gdb) jump <location>:jump需要指定下一条语句的运行点,可以是文件的行号,可以是file:line格式,可以是+num这样偏移量格式

       注意:jump命令不会改变当前的程序栈中的内容。所以,当程序从一个函数跳到另一个函数时,当函数运行完返回并进行弹栈操作时必然

             会发生错误,可能结果还会非常奇怪,甚至产生程序Core Dump。因此,最好是在同一个函数中进行跳转。

5.3 信号的产生及处理

       (gdb) signal <signum>:使用signal命令,可以产生一个信号给被调试的程序。UNIX的系统信号通常从1到15。signal命令和shell的kill命令

                不同,系统的kill命令法信号给被调试程序时,是由gdb截获的,而signal命令发出的信号则直接发给被调试程序的

       (gdb) handle <sig-name> <whatodo>:两个参数一个是信号名,另一个是接受到信号时该做什么。有以下几种可能的参数:

                 nostop:接收到信号时,不要将它发送给程序,也不要停止程序

                 stop:接收到信号时,停止程序的执行,从而允许程序调试;显示一条表示已接收到信号的消息(禁止使用消息除外)

                 print:接收到信号时显示一条消息

                 noprint:接收到信号时不要显示消息(而且隐含着不停止程序运行)。

                 pass:将信号发送给程序,从而允许程序去处理它、停止运行或采取别的动作。

                 nopass:停止程序运行,但不要将先好发送给程序

5.4 强制调用函数

       (gdb) call func(arg1, arg2, ...)

       call和print区别是,如果函数返回void,call不显示,print则显示函数返回值,并把该值存入历史数据中。

5.5 强制函数返回

        (gdb) return <value>

               如果程序有调试断点在某个函数中,并且还有语句没有执行完,可以使用return命令强制函数忽略还没有执行的语句并返回,return 命令后面的值会被认作函数的返回值。

 

6. gdb高级应用

6.1 产生core文件

             在gdb运行正常的程序时,在命令号下运行却会出问题,运行后只留下一个名为core的文件。gdb可以载入core文件并检查上次运行死

      掉前的程序状态。有的系统版本(例如ubuntu)的默认设置不生成core文件,可以执行如下命令允许生成core文件。

              $ulimit -c unlimited

               如果要带一个core文件启动gdb,可以通过shell使用命令gdb:gdb filename core

6.2 跟踪栈上数据

             每个函数和它的变量都指定了一个frame,而最近调用的函数则在0号frame中(叫做底层frame)。这些frame形成了一个程序运行栈,

      要打印此栈,可以使用命令backtrace:

              (gdb) backtrace 或 (gdb) bt

              (gdb) frame

              (gdb) frame up

              (gdb) frame down

6.3 绑定运行进程

       (gdb) detach:离开进程

       (gdb) attach:绑定进程

6.4 源文件搜索

      (gdb) search regexp:在当前文件中向下搜索正则表达式

      (gdb) reverse-search regexp:在当前文件中向上搜索正则表达式

6.5 机器语言工具

      (gdb) info <line/func-name/file:line/file:func-name>:参数可以是源代码的行号、函数名、也可以使用操作符“:”精确定位到某个文件后

              再加上行号或函数。结果会显示所指定的源代码在gdb中运行的内存地址。

      (gdb) disassemble:来查看当前正在执行源程序的汇编代码,它会把目前在内存中要执行源代码的机器指令显示出来。

6.6 其他有用的调试命令

      (gdb) pwd:显示当前工作目录

      (gdb) cd:改变当前工作目录

      (gdb) quit:退出gdb

      (gdb) shell [commandline]:gdb允许在不退出调试环境的情况下运行shell命令

      (gdb) show language:查看当前语言环境

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

      (gdb) info source:查看当前文件的程序语言

猜你喜欢

转载自blog.csdn.net/evilswords/article/details/18353181
今日推荐