GDB调试-简要使用手册

发布于:2024-05-18 ⋅ 阅读:(145) ⋅ 点赞:(0)

使用GDB(GNU调试器)进行调试时,可以通过一系列命令来单步执行代码、跳过不感兴趣的函数、运行到函数末尾、打印变量或寄存器的值、扫描内存、查看调用栈、设置断点和设置监视点。以下是如何执行这些操作的详细说明:

1. 单步执行进入你感兴趣的函数

使用 step 命令可以逐步执行代码并进入函数调用内部:

(gdb) step  # 或简写为 's'

2. 单步执行跳过你不感兴趣的函数(例如库函数)

使用 next 命令逐步执行代码,但不会进入函数调用内部:

(gdb) next  # 或简写为 'n'

3. 运行到函数末尾

使用 finish 命令可以执行当前函数,直到其返回:

(gdb) finish

4. 打印变量或寄存器的值

使用 print 命令打印变量的值:

(gdb) print variable_name  # 或简写为 'p'

打印寄存器的值,可以使用 info registers

(gdb) info registers

5. 扫描内存

使用 x 命令扫描并显示内存内容:

(gdb) x/nfu address
  • n 表示显示的单元数量
  • f 表示显示格式(如 x 代表十六进制,d 代表十进制)
  • u 表示每个单元的大小(如 b 代表字节,h 代表半字,w 代表字)

例如,显示内存地址 0x8048000 开始的 10 个字节内容:

(gdb) x/10xb 0x8048000

6. 查看调用栈

使用 backtrace 命令查看调用栈:

(gdb) backtrace  # 或简写为 'bt'

7. 设置断点

使用 break 命令在指定的行号或函数处设置断点:

(gdb) break filename:line_number
(gdb) break function_name

例如,在 main.c 文件的第 42 行设置断点:

(gdb) break main.c:42

main 函数的开头设置断点:

(gdb) break main

8. 设置监视点

使用 watch 命令设置数据写入监视点,当指定的变量被修改时会中断程序:

(gdb) watch variable_name

例如,监视变量 x 的变化:

(gdb) watch x

设置数据读取监视点(仅在支持的系统上可用):

(gdb) rwatch variable_name

设置数据读写监视点(仅在支持的系统上可用):

(gdb) awatch variable_name

示例调试流程

下面是一个简单的调试示例流程,假设我们有一个名为 example.c 的源代码文件:

#include <stdio.h>

void foo() {
    int x = 10;
    printf("x = %d\n", x);
}

int main() {
    foo();
    return 0;
}

编译代码并开始调试:

gcc -g -o example example.c
gdb example

main 函数设置断点并运行程序:

(gdb) break main
(gdb) run

单步进入 foo 函数:

(gdb) step

单步执行到下一行:

(gdb) next

打印变量 x 的值:

(gdb) print x

查看调用栈:

(gdb) backtrace

继续执行程序直到函数结束:

(gdb) finish

设置监视点监视变量 x 的变化:

(gdb) watch x

希望这些命令和示例能帮助你有效地使用GDB进行调试。如果你有任何其他问题或需要更多详细信息,请随时告诉我!


网站公告

今日签到

点亮在社区的每一天
去签到