gdb常用调试命令
gdb常用调试命令
gdb是GNU项目的一个强大的调试器,可以帮助检查和修改程序的运行状态,发现和修复错误。本文将介绍一些gdb的常用调试命令,以及它们的全称和简写方式。
启动和退出gdb
gdb <program>
:启动gdb,并加载指定的可执行文件<program>
。gdb <program> <core>
:启动gdb,并加载指定的可执行文件<program>
和核心转储文件<core>
,用于分析程序崩溃时的状态。gdb <program> <pid>
:启动gdb,并加载指定的可执行文件<program>
和进程号为<pid>
的正在运行的进程,用于动态调试。quit
或q
:退出gdb。
设置和删除断点
break <location>
或b <location>
:在指定的位置设置一个断点,可以是函数名、文件名:行号、或者内存地址。例如:break main
:在main函数的开始处设置断点。break test.c:10
:在test.c文件的第10行设置断点。break *0x80483f4
:在地址0x80483f4处设置断点。
delete <number>
或d <number>
:删除指定编号的断点。要查看断点编号,可以使用info break
或i b
命令。condition <number> <expression>
或cond <number> <expression>
:给指定编号的断点添加一个条件,只有当表达式为真时,才会停止程序执行。表达式可以使用C语言的语法,以及程序中可用的变量和函数。例如:condition 1 x > 10
:给编号为1的断点添加一个条件,只有当变量x大于10时,才会停止程序执行。
控制程序执行
run <arguments>
或r <arguments>
:运行或重新运行程序,并传递指定的参数。如果设置了断点,程序会在遇到断点时暂停,并显示当前的源代码和寄存器值。例如:run arg1 arg2
:运行程序,并传递arg1和arg2作为参数。
continue
或c
:继续执行程序,直到遇到下一个断点或者程序结束。next
或n
:执行当前行,并跳到下一行。如果当前行是一个函数调用,next会直接执行整个函数,并不进入函数内部。step
或s
:执行当前行,并跳到下一行。如果当前行是一个函数调用,step会进入函数内部,并停在第一行。finish
或f
:继续执行程序,直到当前函数返回,并显示返回值。return <expression>
或ret <expression>
:强制当前函数立即返回,并将返回值设为指定的表达式。如果不指定表达式,则返回值为0。jump <location>
或j <location>
:强制程序跳转到指定的位置,可以是行号、或者内存地址。这会改变程序的正常流程,可能导致一些未定义的行为。例如:jump 20
:强制程序跳转到第20行。jump *0x80483f4
:强制程序跳转到地址0x80483f4处。
查看和修改变量、寄存器和内存
print <expression>
或p <expression>
:打印某个变量或者表达式的值。可以使用任何合法的C语言表达式,包括宏、指针、结构体等。例如:print x
:打印变量x的值。print *p
:打印指针p所指向的值。print foo(x)
:打印调用foo函数并传递x作为参数后的返回值。
set <expression>
:修改某个变量或者表达式的值。可以使用任何合法的C语言表达式,包括宏、指针、结构体等。例如:set x = 10
:修改变量x的值为10。set *p = 20
:修改指针p所指向的值为20。set foo(x) = 30
:修改调用foo函数并传递x作为参数后的返回值为30。
info registers
或i r
:显示所有寄存器的值。info registers <name>
或i r <name>
:显示指定寄存器的值。例如:info registers eax
:显示eax寄存器的值。
set $<name> = <value>
:修改指定寄存器的值。例如:set $eax = 10
:修改eax寄存器的值为10。
x/<n><format><size> <address>
或x/<n><format><size> *<expression>
:检查内存中某个地址或者表达式的值,以指定的格式和大小显示。其中:<n>
是要显示的内存单元的数量,可以省略,默认为1。<format>
是要显示的格式,可以是以下之一:x
:十六进制。d
:十进制。u
:无符号十进制。o
:八进制。t
:二进制。a
:绝对地址。c
:字符。f
:浮点数。s
:字符串。i
:指令。
<size>
是要显示的内存单元的大小,可以是以下之一:b
:字节(8位)。h
:半字(16位)。w
:字(32位)。g
:巨字(64位)。
<address>
是要检查的内存地址,可以是一个立即数或者一个寄存器名。例如:x/4xb 0x80483f4
:检查地址0x80483f4处的内存,以4个字节为单位,每个字节以十六进制显示。
<expression>
是要检查的内存地址,可以是一个C语言表达式,必须在前面加上一个星号。例如:x/4xb *p
:检查指针p所指向的内存,以4个字节为单位,每个字节以十六进制显示。
查看和修改栈帧
backtrace
或bt
:显示当前的函数调用栈,也就是程序从哪里开始,经过了哪些函数,到达了哪里。每一层都会显示函数名、参数、返回地址等信息。例如:
1 | (gdb) backtrace |
frame <number>
或f <number>
:切换到指定编号的栈帧,并显示该栈帧中的源代码和寄存器值。要查看栈帧编号,可以使用backtrace命令。例如:frame 1
:切换到编号为1的栈帧,并显示main函数中的源代码和寄存器值。
info frame <address>
或i f <address>
:显示指定地址处的栈帧信息,包括栈帧大小,栈帧起始地址,栈帧结束地址,参数和局部变量的地址等。例如:info frame 0x80483f4
:显示地址为0x80483f4处的栈帧信息。
info args
或i args
:显示当前栈帧中的函数参数的值。info locals
或i locals
:显示当前栈帧中的局部变量的值。up
:切换到上一层的栈帧,并显示该栈帧中的源代码和寄存器值。down
:切换到下一层的栈帧,并显示该栈帧中的源代码和寄存器值。