📜  GDB-调试程序

📅  最后修改于: 2020-10-15 11:02:27             🧑  作者: Mango


入门:开始和停止

  • gcc -g myprogram.c

    • 使用调试选项(-g)编译myprogram.c。您仍然会看到a.out,但是它包含调试信息,可让您在GDB中使用变量和函数名,而不是原始内存位置(不好玩)。

  • gdb a.out

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

  • [R

  • r arg1 arg2

  • r <文件1

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

  • 帮帮我

  • h个断点

    • 列出帮助主题(帮助)或获取有关特定主题的帮助(h断点)。 GDB有据可查。

  • q-退出GDB

单步执行代码

通过步进,您可以跟踪程序的路径,并在崩溃或返回无效输入的代码中归零。

  • 50

  • 功能

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

  • 下一个

    • 运行程序直到下一行,然后暂停。如果当前行是一个函数,它将执行整个函数,然后暂停。下一步非常适合快速浏览您的代码。

    • 运行下一条指令,而不是行。如果当前指令正在设置变量,则与next相同。如果是一个函数,它将跳入该函数,执行第一条语句,然后暂停。这一步很适合深入您的代码细节。

    • 完成执行当前函数,然后暂停(也称为单步执行)。如果您不小心踏入函数很有用。

断点或观察点

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

  • 打破45

  • 破坏功能

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

    • 设置观察点,当条件发生变化时(x == 3发生变化时),该监视点将暂停程序。监视点非常适合某些输入(myPtr!= NULL),而不必在每次函数调用时中断。

  • 继续

    • 在被断点/监视点暂停后继续执行。程序将继续直到到达下一个断点/观察点。

  • 删除N

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

设置变量

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

  • 打印x

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

  • 设置x = 3

  • 设置x = y

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

  • 调用myotherfunction(x)

  • 呼叫strlen(mystring)

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

  • 显示x

    • 不断显示变量x的值,该变量在每个步骤或暂停之后显示。如果您经常检查某个值,则很有用。

  • 取消显示x

    • 删除由display命令显示的变量的常量显示。

回溯和更改框架

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

  • bt

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

c <= current location 
b 
a 
main 
  • 向上

    • 在函数堆栈中上移或下移到下一帧。如果您在c中,则可以移至ba来检查局部变量。

  • 返回

    • 从当前函数返回。
  • 处理信号

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

    • 处理[信号名] [操作]

    • 处理SIGUSR1不停

    • 处理SIGUSR1 noprint

    • 处理SIGUSR1忽略

      • 指示GDB在发生特定信号(SIGUSR1)时忽略它。有不同程度的忽略。