GDB中通过help来查看GDB有哪几类常用命令:
root@ubuntu:/home/lincoln/lchtool# gdb GNU gdb (GDB) 7.1-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. …… (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 |
1 暂停执行
有3中方式可以通知GDB暂停程序的执行:<1>断点 <2>监视点 <3>捕获点
<1>断点
通知GDB在程序中的特定位置暂停执行。
在程序中的特定“位置”设置断点,当到达那一点时,调试器会暂停程序的执行。其中,“位置”可以指各种源代码行、代码地址、源代码文件中的行号或者函数的入口等。
<1.1>设置断点
命令 |
说明 |
break |
在指定函数的入口处时暂停 |
break |
在源文件filename的函数function入口处暂停 |
break |
在指定行号暂停 |
break |
在源文件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
命令 |
说明 |
watch i |
当i改变值时GDB就暂停 |
watch (i | j > 12) && I > 24 && strlen(name)>6 |
当表达式值改变时,GDB会暂停程序的执行 |
rwatch expr |
当表达式被读时,暂停程序执行 |
awatch expr |
当表达式的值被读或被写时,暂停程序执行 |
<3>捕获点
通知GDB当特定事件发生时暂停执行。
语法:catch
当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
7>unload 或unload
语法:tcatch
只设置一次捕捉点,当程序停住以后,应点被自动删除。
<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则返回 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、
查看命令 |
说明 |
|
显示变量或表达式的值 |
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 |