gdb常用调试命令

本文详细介绍了GDB调试器的常用命令,包括启动与退出、设置和删除断点、控制程序执行、查看和修改变量、寄存器、内存以及栈帧,帮助开发者高效诊断和修复代码问题。

gdb常用调试命令

gdb是GNU项目的一个强大的调试器,可以帮助检查和修改程序的运行状态,发现和修复错误。本文将介绍一些gdb的常用调试命令,以及它们的全称和简写方式。

启动和退出gdb

  • gdb <program>:启动gdb,并加载指定的可执行文件<program>
  • gdb <program> <core>:启动gdb,并加载指定的可执行文件<program>和核心转储文件<core>,用于分析程序崩溃时的状态。
  • gdb <program> <pid>:启动gdb,并加载指定的可执行文件<program>和进程号为<pid>的正在运行的进程,用于动态调试。
  • quitq:退出gdb。

设置和删除断点

  • break <location>b <location>:在指定的位置设置一个断点,可以是函数名、文件名:行号、或者内存地址。例如:

    • break main:在main函数的开始处设置断点。
    • break test.c:10:在test.c文件的第10行设置断点。
    • break *0x80483f4:在地址0x80483f4处设置断点。
  • delete <number>d <number>:删除指定编号的断点。要查看断点编号,可以使用info breaki b命令。

  • condition <number> <expression>cond <number> <expression>:给指定编号的断点添加一个条件,只有当表达式为真时,才会停止程序执行。表达式可以使用C语言的语法,以及程序中可用的变量和函数。例如:

    • condition 1 x > 10:给编号为1的断点添加一个条件,只有当变量x大于10时,才会停止程序执行。

控制程序执行

  • run <arguments>r <arguments>:运行或重新运行程序,并传递指定的参数。如果设置了断点,程序会在遇到断点时暂停,并显示当前的源代码和寄存器值。例如:

    • run arg1 arg2:运行程序,并传递arg1和arg2作为参数。
  • continuec:继续执行程序,直到遇到下一个断点或者程序结束。

  • nextn:执行当前行,并跳到下一行。如果当前行是一个函数调用,next会直接执行整个函数,并不进入函数内部。

  • steps:执行当前行,并跳到下一行。如果当前行是一个函数调用,step会进入函数内部,并停在第一行。

  • finishf:继续执行程序,直到当前函数返回,并显示返回值。

  • 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 registersi 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个字节为单位,每个字节以十六进制显示。

查看和修改栈帧

  • backtracebt:显示当前的函数调用栈,也就是程序从哪里开始,经过了哪些函数,到达了哪里。每一层都会显示函数名、参数、返回地址等信息。例如:
(gdb) backtrace
#0  foo (x=10) at test.c:15
#1  0x080483f9 in main () at test.c:20
  • frame <number>f <number>:切换到指定编号的栈帧,并显示该栈帧中的源代码和寄存器值。要查看栈帧编号,可以使用backtrace命令。例如:

    • frame 1:切换到编号为1的栈帧,并显示main函数中的源代码和寄存器值。
  • info frame <address>i f <address>:显示指定地址处的栈帧信息,包括栈帧大小,栈帧起始地址,栈帧结束地址,参数和局部变量的地址等。例如:

    • info frame 0x80483f4:显示地址为0x80483f4处的栈帧信息。
  • info argsi args:显示当前栈帧中的函数参数的值。

  • info localsi locals:显示当前栈帧中的局部变量的值。

  • up:切换到上一层的栈帧,并显示该栈帧中的源代码和寄存器值。

  • down:切换到下一层的栈帧,并显示该栈帧中的源代码和寄存器值。

### GDB 常用调试命令列表及使用方法 GDB(GNU Debugger)是 GNU 项目提供的一个强大的源代码级调试工具,广泛用于 C、C++ 等语言的调试。以下是一些常用GDB 调试命令及其使用方式。 #### 设置断点与运行控制 使用 `break` 命令设置断点可以暂停程序执行以便检查当前状态: ```bash (gdb) break 10 Breakpoint 1 at 0x40050a: file e.c, line 10. ``` 上述命令将在文件 `e.c` 的第 10 行设置一个断点[^4]。程序可以通过 `run` 命令启动执行: ```bash (gdb) run Starting program: /mnt/hgfs/www/c/gcc/e ``` 一旦程序在断点处停止,可以使用 `continue` 命令继续执行到下一个断点: ```bash (gdb) continue ``` #### 查看和显示变量值 使用 `display` 命令可以在每次程序停止时自动打印指定变量的值: ```bash (gdb) display j 1: j = 0 ``` 该命令会持续显示变量 `j` 的值,直到被取消或修改。也可以显示表达式的结果: ```bash (gdb) display j*2 4: j*2 = 10 ``` #### 单步执行与跳过函数调用 `step` 命令将逐行执行代码,并进入函数内部进行调试: ```bash (gdb) step ``` 如果希望跳过函数内部实现,仅执行整个函数并返回结果,可使用 `next` 命令: ```bash (gdb) next ``` #### 查看堆栈信息与切换帧 当程序发生中断时,可以使用 `backtrace` 或其缩写 `bt` 查看当前的调用堆栈: ```bash (gdb) backtrace ``` 使用 `frame` 命令可以选择特定的堆栈帧以查看局部变量和执行位置: ```bash (gdb) frame 1 ``` #### 修改变量值与内存地址 在调试过程中,可以使用 `set` 命令修改变量的值: ```bash (gdb) set variable i = 5 ``` 此外,也可以直接修改内存地址中的内容: ```bash (gdb) set *(int *)0x7fffffffe548 = 10 ``` #### 控制信号处理行为 通过 `handle` 命令可以定义程序接收到特定信号时的行为。例如,使 GDB 在接收到 `SIGINT` 信号时暂停程序并输出信息: ```bash (gdb) handle SIGINT stop print ``` 若需查看所有信号的处理方式,可以使用: ```bash (gdb) info signals ``` #### 自动保存与加载历史记录 为了提高调试效率,可以启用 GDB 的历史记录功能,并设置保存路径和大小: ```bash (gdb) set history filename gdb.history (gdb) set history save on (gdb) set history size 100 ``` 这些设置确保调试命令历史可在下次启动时恢复使用[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值