做家政建网站,网站交换链接友情链接的作用,网站建设与管理的发展,wordpress主题innmx文章目录 简介GDB 的介绍GDB 的使用 GDB 常用命令及示例查看相关操作断点相关操作运行相关操作变量相关操作分隔窗口操作 简介 GDB 的介绍
GDB 是 GNU 调试程序#xff0c;是用来调试 C 和 C 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况… 文章目录 简介GDB 的介绍GDB 的使用 GDB 常用命令及示例查看相关操作断点相关操作运行相关操作变量相关操作分隔窗口操作 简介 GDB 的介绍
GDB 是 GNU 调试程序是用来调试 C 和 C 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况。它是一个非图形化界面的纯命令行调试器提供了强大的功能和灵活的选项使得开发者能够更轻松地诊断和解决程序中的问题。
GDB 的使用非常依赖于命令行参数和选项因此需要熟悉 GDB 的命令行语法和各种选项GDB 调试程序通常有以下几种方式 启动 GDB 时同时加载待调试程序。使用命令 gdb file_name 来启动并同时加载待调试程序。 先启动 GDB再加载、运行待调试程序。使用命令 gdb 来启动 GDB然后使用命令 load file_name 来加载待调试程序并使用命令 run 来运行程序。 使用 GDB 开启源码界面、界面布局设置。在 GDB 命令行界面输入命令 source file_name 可以开启源码界面使用命令 layout all 来设置界面布局。
除了以上常用的命令外GDB 还提供了很多其他的命令和功能可以使用命令 gdb help 或 man gdb 来查看完整的命令列表和帮助文档。 GDB 的使用
在 Linux 系统中通常默认发布的版本为 Release 版本这个版本的程序在编译时会被优化以提高程序的执行效率。但是这样做会导致程序中的调试信息被删除使得我们无法直接使用 GDB 进行调试。
因此如果需要使用 GDB 调试程序就需要以 Debug 版本发布程序要将 Release 版本的程序发布为 Debug 版本可以使用 GCC 编译器的原文件选项 -o 指定可执行文件的名称再使用 -g 参数来加入调试信息。其中参数 -g 的作用是在生成的可执行文件中加入 调试信息 这样就可以使用 GDB 进行调试了。
举个例子如果我们有一个 Release 版本名为 gdb_test.c 的程序想要将它发布为 Debug 版本可以使用以下命令。
gcc -g gdb_test.c -o test显然Release 版本比 Debug 版本多占一些空间即调试信息所占的空间如下图所示。 然后使用命令 gdb test 启动 GDB 对 test 程序进行调试。 GDB 常用命令及示例 假设 test.c 文件是一个通过递归调用来计算 3 的阶乘的程序该程序的具体代码如下所示。
#include stdio.hint cal(int n)
{if (n 1) {return 1;} else {return n * cal(n - 1);}
}int main()
{int n 3;int s;s cal(n);printf(%d! %d\n, n, s);return 0;
}在 Linux 系统终端下执行命令 gcc -g test.c -o test 对其进行编译其中参数 g 的作用是把调试信息加入生成的 test 可执行文件中否则 GDB 就无法对 test 进行调试。
接下来使用命令 gdb test 启动 GDB 对 test 进行调试了如下图所示。 可以看到GDB 首先显示了版本信息和库信息随后 GDB 停留在符号 (gdb) 处等待用户输入调试命令。GDB 提供了大量的命令来实现各种调试功能下面仅对一些常用的命令进行介绍。 查看相关操作
在调试程序时GCC 会给出产生警告或错误的代码行数但在普通的文本环境中是无法直接获得语句的行数。
(1) list/l 在 GDB 中可以通过命令 l list 的缩写可以查看程序代码如下图所示。 (2) list/l 行号 从某行开始显示源代码不加行号默认从第一行开始显示连续 l 接着上次的位置往下列可以直接回车默认输入上次的指令每次列 10 行如下图所示。 (3) list/l 函数名 表示列出某个函数的源代码即从某个函数开始显示 10 行代码也可以继续向下显示如下图所示。 4info/i locals 查看当前堆栈页的所有变量如下图所示。 可以看出该命令可以显示出该堆栈的所有变量的值。
5where/backtrace/bt 显示当前调用的堆栈列表信息如下图所示。 断点相关操作
在 GDB 中断点是调试程序的重要方法。通过在程序的关键位置设置断点可以让程序在执行到这些位置时停下来从而让我们可以观察程序每一步的执行状况例如当前变量的值、函数是否调用、堆栈使用情况等。
在 GDB 中可以使用命令 b breakpoints 的缩写来设置断点通过命令 info/i beark/b 查看断点的情况及位置信息。
1break/b 行号 在某一行设置断点设置断点后通过命令 i b 查看各个断点情况如下图所示。 2break/b 函数名 在某个函数开头设置断点设置后断点的行数为函数的第一行代码如下图所示。 可以看到命令 break/b 在程序的指定位置处设置了断点并显示了该断点在内存中的物理地址。
3 delete/d 断点号 n 删除序号为 n 的断点如下图所示。 4 delete breakpoints/d 删除所有的断点如下图所示。 5 disable 序号 n 禁用序号为 n 的断点如下图所示。 注意断点在禁用后断点会继续保留但是在运行时并不会在该断点处停止。 6 disable breakpoints/b 禁用所有的断点如下图所示。 7 enable 断点号 n 启用序号为 n 的断点如下图所示。 8 enable breakpoints/b 启用所有的断点如下图所示。 运行相关操作
1 run/r 在 GDB 中通过命令 r run 的缩写运行程序如下图所示。 可以看出GDB 默认从代码的首行开始运行也可以通过 r 行数 的方式让程序从指定行数开始运行如果程序中有断点则程序会在断点行数的前一行暂停运行。
2 continue/c 从当前位置开始连续执行程序遇到断点会停止运行如下图所示。 3 next/n 不进入函数逐过程执行。在执行时会显示当前执行的语句和返回值如下图所示。 4 step/s 进入函数逐语句执行。在执行时会显示当前执行的语句和返回值如下图所示。 5 finish 运行程序直到当前函数完成返回并打印函数返回时的堆栈地址、返回值和参数值等信息如下图所示。 变量相关操作
1 print/p 变量名 查看当前变量的值如下图所示。 可以看出GDB 通过 $N$1 、$2来显示变量的值这样在下次查看变量值时就可以用 $N 代替变量名了。
2set var 变量名 value 修改变量的值如下图所示。 3display 变量名 跟踪查看一个变量每次停下来都显示它的值跟踪显示变量时是有序号的如下图所示。 分隔窗口操作
分隔窗口方便一边查看代码一边进行测试。
1layout src 显示代码窗口效果如下图所示。 2layout asm 显示反汇编窗口效果如下图所示。 3layout regs 显示源代码/反汇编和 CPU 寄存器窗口效果如下图所示。 (4layout split 显示源代码和反汇编窗口效果如下图所示。 参考链接 GDB 官网 参考书籍《高质量嵌入式 Linux C编程梁庚 著