b
i b
dis
d
break
,但在程序第一次停住后会被自动删除s
n
fin
u
c
p
h
r
bt
使用 break
命令(缩写 b
)来设置断点。html
用法:linux
break
当不带参数时,在所选栈帧中执行的下一条指令处设置断点。break <function-name>
在函数体入口处打断点,在 C++ 中可使用 class::function
或 function(type, ...)
格式来指定函数名。break <line-number>
在当前源码文件指定行的开始处打断点。break -N
break +N
在当前源码行前面或后面的 N
行开始处打断点,N
为正整数。break <filename:linenum>
在源码文件 filename
的 linenum
行处打断点。break <filename:function>
在源码文件 filename
的 function
函数入口处打断点。break <address>
在程序指令的地址处打断点。break ... if <cond>
设置条件断点,...
表明上述参数之一(或无参数),cond
为条件表达式,仅在 cond
值非零时暂停程序执行。详见官方文档。git
查看断点,观察点和捕获点的列表。github
用法:express
info breakpoints [list...]
info break [list...]
list...
用来指定若干个断点的编号(可省略),能够是 2
, 1-3
, 2 5
等。禁用一些断点。参数是用空格分隔的断点编号。要禁用全部断点,不加参数。函数
禁用的断点不会被忘记,但直到从新启用才有效。ui
用法:spa
disable [breakpoints] [list...]
breakpoints
是 disable
的子命令(可省略),list...
同 info breakpoints
中的描述。详见官方文档。线程
启用一些断点。给出断点编号(以空格分隔)做为参数。没有参数时,全部断点被启用。调试
用法:
enable [breakpoints] [list...]
启用指定的断点(或全部定义的断点)。enable [breakpoints] once list...
临时启用指定的断点。GDB 在中止您的程序后当即禁用这些断点。enable [breakpoints] delete list...
使指定的断点启用一次,而后删除。一旦您的程序中止,GDB 就会删除这些断点。等效于用 tbreak
设置的断点。breakpoints
同 disable
中的描述。
详见官方文档。
在指定行或函数处清除断点。参数能够是行号,函数名称或 *
跟一个地址。
用法:
clear
当不带参数时,清除所选栈帧在执行的源码行中的全部断点。clear <function>
, clear <filename:function>
删除在命名函数的入口处设置的任何断点。clear <linenum>
, clear <filename:linenum>
删除在指定的文件指定的行号的代码中设置的任何断点。clear <address>
清除指定程序指令的地址处的断点。详见官方文档。
删除一些断点或自动显示表达式。参数是用空格分隔的断点编号。要删除全部断点,不加参数。
用法: delete [breakpoints] [list...]
详见官方文档。
设置临时断点。参数形式同 break
同样。
除了断点是临时的以外,其余同 break
同样,因此在命中时会被删除。
详见官方文档。
为表达式设置观察点。
用法: watch [-l|-location] <expr>
每当一个表达式的值改变时,观察点就会暂停程序执行。
若是给出了 -l
或者 -location
,则它会对 expr
求值并观察它所指向的内存。例如,watch *(int *)0x12345678
将在指定的地址处观察一个 4 字节的区域(假设 int 占用 4 个字节)。
详见官方文档。
单步执行程序,直到到达不一样的源码行。
用法: step [N]
参数 N
表示执行 N 次(或因为另外一个缘由直到程序中止)。
警告:若是当控制在没有调试信息的状况下编译的函数中使用 step
命令,则执行将继续进行,直到控制到达具备调试信息的函数。 一样,它不会进入没有调试信息编译的函数。
要执行没有调试信息的函数,请使用 stepi
命令,详见后文。
详见官方文档。
反向单步执行程序,直到到达另外一个源码行的开头。
用法: reverse-step [N]
参数 N
表示执行 N 次(或因为另外一个缘由直到程序中止)。
详见官方文档。
单步执行程序,执行完子程序调用。
用法: next [N]
与 step
不一样,若是当前的源代码行调用子程序,则此命令不会进入子程序,而是将其视为单个源代码行,继续执行。
详见官方文档。
反向步进程序,执行完子程序调用。
用法: reverse-next [N]
若是要执行的源代码行调用子程序,则此命令不会进入子程序,调用被视为一个指令。
参数 N
表示执行 N 次(或因为另外一个缘由直到程序中止)。
详见官方文档。
您可使用 return
命令取消函数调用的执行。若是你给出一个表达式参数,它的值被用做函数的返回值。
用法: return <expression>
将 expression
的值做为函数的返回值并使函数直接返回。
详见官方文档。
执行直到选定的栈帧返回。
用法: finish
返回后,返回的值将被打印并放入到值历史记录中。
详见官方文档。
执行直到程序到达当前栈帧中当前行以后(与 break 命令相同的参数)的源码行。此命令用于经过一个屡次的循环,以免单步执行。
用法:until <location>
或 u <location>
继续运行程序,直到达到指定的位置,或者当前栈帧返回。
详见官方文档。
在信号或断点以后,继续运行被调试的程序。
用法: continue [N]
若是从断点开始,可使用数字 N
做为参数,这意味着将该断点的忽略计数设置为 N - 1
(以便断点在第 N 次到达以前不会中断)。若是启用了非中止模式(使用 show non-stop
查看),则仅继续当前线程,不然程序中的全部线程都将继续。
详见官方文档。
求值并打印表达式 EXP 的值。可访问的变量是所选栈帧的词法环境,以及范围为全局或整个文件的全部变量。
用法:
print [expr]
或 print /f [expr]
expr
是一个(在源代码语言中的)表达式。默认状况下,expr
的值以适合其数据类型的格式打印;您能够经过指定 /f
来选择不一样的格式,其中 f
是一个指定格式的字母;详见输出格式。
若是省略 expr
,GDB 再次显示最后一个值。
要以每行一个成员带缩进的格式打印结构体变量请使用命令 set print pretty on
,取消则使用命令 set print pretty off
。
可以使用命令 show print
查看全部打印的设置。
详见官方文档。
检查内存。
用法: x/nfu <addr>
或 x <addr>
n
、f
和 u
都是可选参数,用于指定要显示的内存以及如何格式化。addr
是要开始显示内存的地址的表达式。
n
重复次数(默认值是 1),指定要显示多少个单位(由 u
指定)的内存值。
f
显示格式(初始默认值是 x
),显示格式是 print('x','d','u','o','t','a','c','f','s')
使用的格式之一,再加 i
(机器指令)。
u
单位大小,b
表示单字节,h
表示双字节,w
表示四字节,g
表示八字节。
例如:
x/3uh 0x54320
表示从地址 0x54320 开始以无符号十进制整数的格式,双字节为单位来显示 3 个内存值。
x/16xb 0x7f95b7d18870
表示从地址 0x7f95b7d18870 开始以十六进制整数的格式,单字节为单位显示 16 个内存值。
详见官方文档。
每次程序暂停时,打印表达式 EXP 的值。
用法: display <expr>
, display/fmt <expr>
或 display/fmt <addr>
fmt
用于指定显示格式。像 print 命令里的 /f
同样。
对于格式 i
或 s
,或者包括单位大小或单位数量,将表达式 addr
添加为每次程序中止时要检查的内存地址。
详见官方文档。
打印自动显示的表达式列表,每一个表达式都带有项目编号,但不显示其值。
包括被禁用的表达式和不能当即显示的表达式(当前不可用的自动变量)。
取消某些表达式在程序暂停时的自动显示。参数是表达式的编号(使用 info display
查询编号)。不带参数表示取消全部自动显示表达式。
delete display
具备与此命令相同的效果。
禁用某些表达式在程序暂停时的自动显示。禁用的显示项目不会被自动打印,但不会被忘记。 它可能稍后再次被启用。
参数是表达式的编号(使用 info display
查询编号)。不带参数表示禁用全部自动显示表达式。
启用某些表达式在程序暂停时的自动显示。
参数是从新显示的表达式的编号(使用 info display
查询编号)。不带参数表示启用全部自动显示表达式。
打印命令列表。
您可使用不带参数的 help
(缩写为 h
)来显示命令的类别名的简短列表。
使用 help <class>
您能够获取该类中的各个命令的列表。使用 help <command>
显示如何使用该命令。
详见官方文档。
挂接到 GDB 以外的进程或文件。该命令能够将进程 ID 或设备文件做为参数。
对于进程 ID,您必须具备向进程发送信号的权限,而且必须具备与调试器相同的有效的 uid。
用法: attach <process-id>
GDB 在安排调试指定的进程以后作的第一件事是暂停该进程。
不管是经过 attach
命令挂接的进程仍是经过 run
命令启动的进程,您均可以使用的 GDB 命令来检查和修改挂接的进程。
详见官方文档。
启动被调试的程序。
能够直接指定参数,也能够用 set args 设置(启动所需的)参数。
例如: run arg1 arg2 ...
等效于
set args arg1 arg2 ...
run
还容许使用 >
、 <
或 >>
进行输入和输出重定向。
详见官方文档。
打印总体栈帧信息。
bt
打印总体栈帧信息,每一个栈帧一行。bt n
相似于上,但只打印最内层的 n 个栈帧。bt -n
相似于上,但只打印最外层的 n 个栈帧。bt full n
相似于 bt n
,还打印局部变量的值。where
和 info stack
(缩写 info s
) 是 backtrace
的别名。调用栈信息相似以下:
(gdb) where
#0 vconn_stream_run (vconn=0x99e5e38) at lib/vconn-stream.c:232
#1 0x080ed68a in vconn_run (vconn=0x99e5e38) at lib/vconn.c:276
#2 0x080dc6c8 in rconn_run (rc=0x99dbbe0) at lib/rconn.c:513
#3 0x08077b83 in ofconn_run (ofconn=0x99e8070, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:1234
#4 0x08075f92 in connmgr_run (mgr=0x99dc878, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:286
#5 0x08057d58 in ofproto_run (p=0x99d9ba0) at ofproto/ofproto.c:1159
#6 0x0804f96b in bridge_run () at vswitchd/bridge.c:2248
#7 0x08054168 in main (argc=4, argv=0xbf8333e4) at vswitchd/ovs-vswitchd.c:125
详见官方文档。
打印类型 TYPE 的定义。
用法: ptype[/FLAGS] TYPE-NAME | EXPRESSION
参数能够是由 typedef
定义的类型名, 或者 struct STRUCT-TAG
或者 class CLASS-NAME
或者 union UNION-TAG
或者 enum ENUM-TAG
。
根据所选的栈帧的词法上下文来查找该名字。
相似的命令是 whatis
,区别在于 whatis
不展开由 typedef
定义的数据类型,而 ptype
会展开,举例以下:
/* 类型声明与变量定义 */
typedef double real_t;
struct complex {
real_t real;
double imag;
};
typedef struct complex complex_t;
complex_t var;
real_t *real_pointer_var;
这两个命令给出了以下输出:
(gdb) whatis var
type = complex_t
(gdb) ptype var
type = struct complex {
real_t real;
double imag;
}
(gdb) whatis complex_t
type = struct complex
(gdb) whatis struct complex
type = struct complex
(gdb) ptype struct complex
type = struct complex {
real_t real;
double imag;
}
(gdb) whatis real_pointer_var
type = real_t *
(gdb) ptype real_pointer_var
type = double *
详见官方文档。
译者:robot527 校对:mudongliang, wxy
编译自:https://sourceware.org/gdb/current/onlinedocs/gdb/做者: Fsf
原创:LCTT https://linux.cn/article-8900-1.html译者: robot527