GDB(三):gdb 常用命令

    GDB中通过help来查看GDB有哪几类常用命令:

root@ubuntu:/home/lincoln/lchtool# gdb

GNU gdb (GDB) 7.1-ubuntu

Copyright (C) 2010 Free Software Foundation, Inc.

……

<http://www.gnu.org/software/gdb/bugs/>.

(gdb) help

List of classes of commands:

 

aliases -- Aliases of other commands

breakpoints -- Making program stop at certain points

data -- Examining data

files -- Specifying and examining files

internals -- Maintenance commands

obscure -- Obscure features

running -- Running the program

stack -- Examining the stack

status -- Status inquiries

support -- Support facilities

tracepoints -- Tracing of program execution without stopping the program

user-defined -- User-defined commands

 

Type "help" followed by a class name for a list of commands in that class.

Type "help all" for the list of all commands.

Type "help" followed by command name for full documentation.

Type "apropos word" to search for commands related to "word".

Command name abbreviations are allowed if unambiguous.

(gdb)help breakpoints   /*通过help <class>,如help breakpoints 查看设置断点的所有命令*/


1 暂停执行

        有3中方式可以通知GDB暂停程序的执行:<1>断点     <2>监视点   <3>捕获点  

<1>断点

通知GDB在程序中的特定位置暂停执行。

在程序中的特定“位置”设置断点,当到达那一点时,调试器会暂停程序的执行。其中,“位置”可以指各种源代码行、代码地址、源代码文件中的行号或者函数的入口等。

<1.1>设置断点

命令

说明

break  <function>    

在指定函数的入口处时暂停

break  <filename:function>

在源文件filename的函数function入口处暂停

break  <linenum>   

在指定行号暂停

break  <filename:linenum>

在源文件filename的linenum行暂停

break  <+offset>

在当前行号的前offset行暂停

break  <-offset> 

在当前行号的后offset行暂停

break  *address 

在程序运行的内存地址address处暂停

tbreak  同上

临时断点

rbreak  正则表达式

rbreak list_*   即在所有以 list_ 为开头字符的函数地方都设置断点

info breakpoints [n]

查看所有断点或断点n的信息

 

<1.2>设置条件断点

1>设置条件断点

语法:break break-args if  (condition)   其中,condition是具有布尔值的表达式,包括:

1.1>相等、逻辑和不等运算符(<、<=、==、!=、>、>=、&&、||等),如:

break180 if string==NULL && i<0

1.2>按位或移位运算符(&、|、^、>>、<<等),如:

    break test.c:34 if (x&y) == 1

1.3>算术运算符(+、-、*、/、%等),如:

    break myfunc if  i % (j+3) != 0

1.4>函数,只要被链接到程序中,如:

    break test.c:myfunc if !check_variable_sanity(i)

1.5>库函数,只要被链接到程序中,如:

    break 44 if strlen(mystring) == 0

 

2>将无条件断点转为条件断点

例如,将断点3设置为条件断点,添加的条件是i==3:

(gdb)cond 3 i==3

删除条件,但保持该断点:

(gdb)cond 3

 

<1.3>断点命令列表

        遇到GDB断点时,几乎总要查看某个变量。如果反复遇到同一断点,将反复查看相同的变量。此时,可以使用断点命令列表,让GDB在每次到达某个断点时自动执行一组命令。

        使用commands命令设置命令列表:

commandsbreakpoint-number

commands            /*该命令可以是printf 等命令,也可以是自定义命令 define*/

end

示例:

(gdb) define my_cmd              //自定义命令

Type commands for definition of "my_cmd".

End with a line saying just "end".

>printf "this is my cmd\n"

>printf "i = %d, sum = %d\n", $arg0, $arg1

>end

(gdb) commands 1

Type commands for when breakpoint 1 is hit, one per line.

End with a line saying just "end".

>printf "will usr my cmd\n"    //printf 命令

>my_cmd i sum                    //自定义命令my_cmd, i和sum为参数

>end

(gdb)

 

<1.4>删除和禁用断点

命令

说明

delete breakpoint_list (数字或一系列数字)

delete 2    //删除第二个断点

delete 2 4 //删除第二个和第四个断点

delete

删除所有断点

clear

删除gdb将执行的下一个指令处的断点

clear function

clear filename:function

clear line_number

clear filename:line_number

根据位置清除断点,工作方式与对应的break命令相似

disable 3

禁用第三个断点

enable 1 5

启用第一个和第五个断点

enable once breakpoint-list

在该断点下次引起GDB暂停执行后禁用它

 

<2>监视点

        通知GDB当特定内存位置(或者涉及一个或多个位置的表达式)的值发生变化时暂停执行。

        监视点是一种特殊类型的断点,区别在于监视点没有“驻在”某一行源代码中,而是指示GDB每当某个表达式改变了值就暂停执行。

        其中,GDB中的表达式可以包含很多内容:

>便于GDB使用的变量

>程序中的任何在作用域内的变量

>任何种类的字符串、数值或字符常量

>预处理器宏

>条件、函数调用、类型强制转换和所用语言定义的运算符。

 

语法:watch <expr>

命令

说明

watch i

当i改变值时GDB就暂停

watch (i | j > 12) && I > 24 && strlen(name)>6

当表达式值改变时,GDB会暂停程序的执行

rwatch expr

当表达式被读时,暂停程序执行

awatch expr

当表达式的值被读或被写时,暂停程序执行

 

 

<3>捕获点

        通知GDB当特定事件发生时暂停执行。

语法:catch <event>

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

1>throw 一个C++抛出的异常。(throw为关键字)

2>catch 一个C++捕捉到的异常。(catch为关键字)

3>exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)

4>fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)

5>vfork 调用系统调用vfork时。(vfork 为关键字,目前此功能只在HP-UX下有用)

6>load 或load<libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)

7>unload 或unload<libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

 

语法:tcatch<event>

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

 

<4>查看断点

命令

说明

info breakpoints [n]

查看所有断点或断点n的信息

info break [n]

查看所有断点或断点n的信息

(gdb) info break

Num     Type           Disp Enb Address            What

1       breakpoint     keep y  0x000000000040052b in process at breakif.c:7

   其中,

1>标识符(Num):断点的唯一标识符,即断点号

2>类型(Type): 断点的类型:断点、监视点、捕获点

3>部署(Disp):每个断点都有一个部署,指示断点下次引起GDB暂停程序执行后该断点会发生什么事,可能的部署有3种:

3.1>保持(keep):下次到达断点后不改变断点。(新建断点的默认部署)

3.2>删除(del):下次到达断点后删除该断点。(使用tbreak命令创建的任何断点都是如此)

3.3>禁用(dis):下次到达断点时会禁用该断点。(使用enableonce命令设置的断点)

4>启用状态(Enb):说明断点当前是启用还是禁用

5>地址(Address):这是内存中设置断点的位置。它主要供汇编程序员或者试图调试没有用扩充的符号表编译的可执行文件的人使用。

6>位置(What):断点位于源代码位置的特定行号和文件名。



2 恢复执行

    在断点处暂停后的恢复执行方法有:

<1>使用step和next单步调试

<2>使用continue恢复程序执行

<3>使用finish恢复程序执行   —— 简写为fin,用来完成当前函数的执行。

<4>使用until恢复程序执行    —— 简写为u,用来在不进一步在循环中暂停(除了循环中的中间断点)的情况下完成正在执行的循环。

命令

说明

next

单步调试,不进入函数

step

单步调试,进入函数

continue

无条件恢复程序执行,直到它遇到另一个断点或程序结束。

continue n  //恢复执行n次

finish

用来完成当前函数的执行,忽略还没执行的语句

return <expr>

使函数以expr表达式返回出去,忽略还没有执行的语句.若无expr则返回 void 出去

until

用来在不进一步在循环中暂停(除了循环中的中间断点)的情况下完成正在执行的循环

jump line

跳转到指定行号执行且一直执行下去不会暂停,故而需要与break或tbreak配合使用。又因为jump不会改变当前的程序栈中的内容,所以从一个函数跳转到另一函数时,当函数运行完返回时执行弹栈操作时会产生错误,故而jump一般在同一个函数中进行跳转。

call

强制调用函数




3 查看和设置变量

<1>p        —— 用来查看变量的值,如p i   也可用来设置变量,如p i=4 

<2>set     —— 用来设置变量的值,如set var i = 1;   set args  argument1 argument2;

<3>x        —— 用来查看指定内存地址上面的值

<4>info    ——  用来查看breakpoints、threads、frame、args、locals、catch、registers、all-registers、

查看命令

说明

print

显示变量或表达式的值

display

程序暂停执行时心事变量或表达式的值

undisplay

display的反命令

pwd

显示当前工作目录

ptype

显示一个数据结构的声明内容或显示变量、函数的类型

whatis

显示变量或函数类型


设置命令

说明

print x = 4

把变量x的值设置为4

set var x = 4

把变量x的值设置为4

set args 1 2 3 4

设置参数1、参数2、参数3、参数4的值

set $myvar = 123

设置自定义变量myvar的值为123



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值