如何使用 GDB 调试 C 程序?

178 阅读3分钟

使用 GDB(GNU Debugger) 调试 C 程序可以帮助你查找和修复代码中的错误。以下是使用 GDB 调试 C 程序的详细步骤:


1. 编译程序时启用调试信息

在使用 GDB 调试之前,需要在编译 C 程序时启用调试信息。调试信息会包含源代码、变量名、行号等信息,帮助 GDB 定位问题。

使用 -g 选项编译程序:

gcc -g -o my_program my_program.c
  • -g:生成调试信息。
  • -o my_program:指定输出文件名为 my_program

2. 启动 GDB

编译完成后,使用 GDB 启动程序:

gdb ./my_program

这将启动 GDB 并加载你的程序。


3. 常用 GDB 命令

以下是一些常用的 GDB 命令及其功能:

运行程序

  • runr:运行程序。
    (gdb) run
    
    如果程序需要命令行参数,可以在 run 后面加上参数:
    (gdb) run arg1 arg2
    

设置断点

  • breakb:在指定位置设置断点。
    • 在函数入口处设置断点:
      (gdb) break main
      
    • 在指定行号设置断点:
      (gdb) break my_program.c:10
      

查看断点

  • info breakpointsi b:查看所有断点。
    (gdb) info breakpoints
    

删除断点

  • deleted:删除指定断点。
    (gdb) delete 1
    
    1 是断点的编号,可以通过 info breakpoints 查看。

单步执行

  • nextn:执行下一行代码(不进入函数)。
    (gdb) next
    
  • steps:执行下一行代码(进入函数)。
    (gdb) step
    

继续执行

  • continuec:继续执行程序,直到遇到下一个断点或程序结束。
    (gdb) continue
    

查看变量

  • printp:打印变量的值。
    (gdb) print my_variable
    

查看源代码

  • listl:显示当前代码行附近的源代码。
    (gdb) list
    
    可以指定行号或函数名:
    (gdb) list 10
    (gdb) list main
    

查看堆栈

  • backtracebt:查看函数调用堆栈。
    (gdb) backtrace
    

退出 GDB

  • quitq:退出 GDB。
    (gdb) quit
    

4. 示例调试过程

假设有一个简单的 C 程序 my_program.c

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5;
    int y = 10;
    int z = add(x, y);
    printf("Result: %d\n", z);
    return 0;
}

调试步骤

  1. 编译程序:

    gcc -g -o my_program my_program.c
    
  2. 启动 GDB:

    gdb ./my_program
    
  3. 设置断点:

    (gdb) break main
    
  4. 运行程序:

    (gdb) run
    
  5. 单步执行:

    (gdb) next
    
  6. 查看变量:

    (gdb) print x
    
  7. 继续执行:

    (gdb) continue
    
  8. 退出 GDB:

    (gdb) quit
    

5. 高级功能

  • 条件断点:设置条件断点,当条件满足时触发。

    (gdb) break my_program.c:10 if x == 5
    
  • 观察点:监控变量的变化。

    (gdb) watch x
    
  • 多线程调试:调试多线程程序。

    (gdb) info threads
    (gdb) thread 2
    
  • 反汇编:查看汇编代码。

    (gdb) disassemble main
    

总结

GDB 是一个功能强大的调试工具,可以帮助你定位和修复 C 程序中的错误。通过设置断点、单步执行、查看变量等操作,你可以深入了解程序的运行状态。熟练掌握 GDB 的使用,可以显著提高调试效率。