gdb基础使用

Posted by Dandan on September 19, 2023

前言

作为一个C程序员,我认为gdb是最基础的一个工具,有个同事问起来了,顺便整理一下做个记录。
GDB(GNU Debugger)是一款功能强大的开源调试器,用于分析、诊断和修复程序中的错误和问题。它提供了多种功能,对开发人员和调试人员来说非常有用。以下是使用GDB的一些好处:

1.查找程序错误:GDB允许您在程序崩溃、引发异常或产生不符合预期结果时停止程序执行,从而帮助您找到程序中的错误。

2.断点设置:您可以在程序中设置断点,以便在特定位置暂停程序执行。这有助于您逐步执行代码并查看变量的值,从而更容易诊断问题。

3.条件断点:GDB允许您设置条件断点,这意味着只有在特定条件满足时才会触发断点。这对于查找特定情况下的错误非常有用。

4.追踪调用堆栈:GDB可以显示函数调用的堆栈信息,帮助您了解程序执行的路径和函数调用的顺序,有助于找到错误的根本原因。

5.变量查看:您可以使用GDB查看程序中的变量的值,甚至进行数学运算和表达式求值。这有助于理解程序状态和问题的来源。

6.寄存器查看:GDB允许您查看CPU寄存器的内容,对于底层的调试非常有用。

7.反汇编:GDB还可以用于查看程序的汇编代码,这对于分析低级问题或优化代码非常有帮助。

8.多平台支持:GDB不仅可以在Linux上使用,还可以在多种操作系统上运行,包括Windows、macOS、和各种UNIX变种。

9.脚本化和扩展:您可以使用GDB的脚本语言来自动化调试任务,并编写自定义扩展,以适应特定的调试需求。

总之,GDB是一个强大的调试工具,可以帮助开发人员诊断和修复各种编程问题,从简单的逻辑错误到底层的系统问题。无论是在开发新应用程序还是在维护现有代码时,GDB都是一个有力的伙伴。

例子

首先得确保所在的环境中有gdb工具,如果没有需要先安装(以ubuntu为例):

sudo apt-get update  # 更新软件包列表
sudo apt-get install gdb  # 安装GDB

接下来,让我们创建一个简单的C程序并使用GDB进行调试。假设我们有以下的C程序文件 example.c:

#include <stdio.h>

int main() {
    int a = 5;
    int b = 0;
    int result;

    result = a / b;  // 这里会触发除以零的错误

    printf("Result: %d\n", result);

    return 0;
}

现在,让我们来演示如何使用GDB来调试这个程序:

1.打开终端,并进入包含 example.c 文件的目录。

2.编译程序时,确保启用调试信息,可以使用 -g 选项:

gcc -g -o example example.c

3.启动GDB并加载可执行文件:

gdb ./example

4.在GDB中,首先设置断点,以便在特定的位置停止执行:

  • 函数断点 : 后跟要中断执行的函数名
    break main
    
  • 行数断点 :后跟要中断执行的行号
    break 10  # 在第 10 行设置断点
    
  • 条件断点 : 后跟条件表达式
    break 15 if a == 0  # 如果变量 a 等于 0,将在第 15 行触发断点
    
  • 清除断点: 若要清除断点,使用 clear 命令,后跟要清除的断点号或函数名。
    clear 1  # 清除断点编号为 1 的断点
    

    使用 clear 命令时不跟参数,将清除所有断点。

    clear  # 清除所有断点
    

    5.现在运行程序,直到达到断点:

    run
    

    程序将在 main 函数内的第一行停止。

6.您可以使用GDB的各种命令来检查变量的值,如:

  • print a:查看变量 a 的值。
  • print b:查看变量 b 的值。
  • print a + b # 计算并查看 a 和 b 的和;可以使用表达式进行计算和查看结果。 7.若要单步执行代码,可以使用 next 命令:
    next
    

    这将逐行执行代码并停在下一行。

8.当程序崩溃或出现错误时,您可以使用 backtrace 命令查看调用堆栈:

backtrace

这将显示函数调用的堆栈信息,有助于找到错误的来源。

9.寄存器

  • 您可以使用 info registers 命令查看CPU寄存器的值。这对于底层的调试非常有用。
    info registers
    
  • 如果需要查看特定寄存器(例如,EAX、EBX等),可以使用寄存器名称作为参数。
    info registers eax
    

    9.当您完成调试时,使用 quit 命令退出GDB。

这些是一些基本的GDB命令,用于设置断点、清除断点、查看变量和寄存器。GDB还提供了其他高级调试功能,例如监视点、反汇编、内存查看等,以帮助您更深入地分析和调试程序。可以使用 help 命令在GDB中获得有关特定命令的详细信息,例如 help breakhelp print

未完待续。。。