GDB - 调试程序



入门:启动和停止

  • gcc -g myprogram.c

    • 使用调试选项 (-g) 编译 myprogram.c。你仍然会得到一个 a.out 文件,但它包含调试信息,允许你在 GDB 中使用变量和函数名称,而不是原始内存位置(不好玩)。

  • gdb a.out

    • 使用文件 a.out 打开 GDB,但不运行程序。你会看到一个提示符 (gdb) - 所有示例都来自此提示符。

  • r

  • r arg1 arg2

  • r < file1

    • 三种运行先前加载的“a.out”的方法。你可以直接运行它 (r),传递参数 (r arg1 arg2),或输入文件。你通常会在运行之前设置断点。

  • help

  • h breakpoints

    • 列出帮助主题 (help) 或获取有关特定主题的帮助 (h breakpoints)。GDB 文档齐全。

  • q - 退出 GDB

单步执行代码

单步执行允许你跟踪程序的路径,并聚焦于导致崩溃或返回无效输入的代码。

  • l

  • l 50

  • l myfunction

    • 列出当前行 (l) 的 10 行源代码、特定行 (l 50) 的源代码或函数 (l myfunction) 的源代码。

  • next

    • 运行程序直到下一行,然后暂停。如果当前行是函数,它将执行整个函数,然后暂停。next 适用于快速遍历代码。

  • step

    • 运行下一条指令,而不是下一行。如果当前指令正在设置变量,则它与next相同。如果它是一个函数,它将跳转到该函数,执行第一条语句,然后暂停。step 适用于深入了解代码细节。

  • finish

    • 完成当前函数的执行,然后暂停(也称为步出)。如果你不小心步入了一个函数,这很有用。

断点或观察点

断点在调试中起着重要作用。当程序到达某个点时,它们会暂停(中断)程序。你可以检查和更改变量并恢复执行。当某些输入失败发生或需要测试输入时,这很有帮助。

  • break 45

  • break myfunction

    • 在第 45 行或 myfunction 处设置断点。程序到达断点时将暂停。
  • watch x == 3

    • 设置观察点,当条件更改时(当 x == 3 更改时)暂停程序。观察点非常适合某些输入(myPtr != NULL),而无需在每个函数调用上中断。

  • continue

    • 在断点/观察点暂停后恢复执行。程序将继续执行,直到遇到下一个断点/观察点。

  • delete N

    • 删除断点 N(创建时会对断点进行编号)。

设置变量

在运行时查看和更改变量是调试的关键部分。尝试向函数提供无效输入或运行其他测试用例以查找问题的根本原因。通常,你将在程序暂停时查看/设置变量。

  • print x

    • 打印变量 x 的当前值。能够使用原始变量名称是需要 (-g) 标志的原因;常规编译的程序已删除此信息。

  • set x = 3

  • set x = y

    • 将 x 设置为一个设置值 (3) 或另一个变量 (y)
  • call myfunction()

  • call myotherfunction(x)

  • call strlen(mystring)

    • 调用用户定义或系统函数。这非常有用,但要注意调用有错误的函数。

  • display x

    • 持续显示变量 x 的值,该值在每次步骤或暂停后显示。如果你不断检查某个值,这很有用。

  • undisplay x

    • 删除 display 命令显示的变量的持续显示。

回溯和更改帧

栈是当前函数调用的列表 - 它显示你在程序中的位置。存储单个函数调用的详细信息,例如参数。

  • bt

    • 回溯或打印当前函数栈以显示你在当前程序中的位置。如果 main 调用函数 a(),a() 调用 b(),b() 调用 c(),则回溯为

  • c <= current location 
    b 
    a 
    main 
    
  • up

  • down

    • 在函数栈中向上或向下移动到下一帧。如果你在c中,你可以移动到ba以检查局部变量。

  • return

    • 从当前函数返回。

处理信号

信号是在某些事件(例如计时器或错误)之后抛出的消息。GDB 可能会在遇到信号时暂停;你可能希望改为忽略它们。

  • handle [signalname] [action]

  • handle SIGUSR1 nostop

  • handle SIGUSR1 noprint

  • handle SIGUSR1 ignore

    • 指示 GDB 在发生时忽略某个信号 (SIGUSR1)。有不同级别的忽略。

广告