启动GDB调试器C/C++程序
![]() 通过前面的学习,读者已经了解了什么是 GDB,以及如何下载并安装它。从本节开始,我们将正式学习使用 GDB 调试 C、C++ 程序。 如下是一段能够正常编译运行的 C 语言程序:
本节就以此程序为例,给大家演示 GDB 调试器的基本用法。 使用GDB的前期准备通过前面的学习我们知道,GDB 的主要功能就是监控程序的执行流程。这也就意味着,只有当源程序文件编译为可执行文件并执行时,GDB 才会派上用场。 Linux 发行版中,经常使用 GCC 编译 C、C++ 程序(有关 GCC 编译器,但需要注意的是,仅使用 gcc(或 g++)命令编译生成的可执行文件,是无法借助 GDB 进行调试的。 以 main.c 源文件为例,正常情况下,使用 GCC 编译该源代码的指令如下:[root@bogon demo]# ls main.c [root@bogon demo]# gcc main.c -o main.exe [root@bogon demo]# ls main.c main.exe 可以看到,这里已经生成了 main.c 对应的执行文件 main.exe,但值得一提的是,此文件不支持使用 GDB 进行调试。原因很简单,使用 GDB 调试某个可执行文件,该文件中必须包含必要的调试信息(比如各行代码所在的行号、包含程序中所有变量名称的列表(又称为符号表)等),而上面生成的 main.exe 则没有。 那么,如何生成符合 GDB 调试要求的可执行文件呢?很简单,只需要使用 gcc -g 选项编译源文件,即可生成满足 GDB 要求的可执行文件。仍以 main.c 源程序文件为例:[root@bogon demo]# ls main.c [root@bogon demo]# gcc main.c -o main.exe -g [root@bogon demo]# ls main.c main.exe 由此生成的 main.exe,即可使用 GDB 进行调试。值得一提的是,GCC 编译器支持 -O(等于同 -O1,优化生成的目标文件)和 -g 一起参与编译。GCC 编译过程对进行优化的程度可分为 5 个等级,分别为 O0~O4,O0 表示不优化(默认选项),从 O1 ~ O4 优化级别越来越高,O4 最高。 而相对于 -O -g 选项,对 GDB 调试器更友好的是 -Og 选项,-Og 对代码所做的优化程序介于 O0 ~ O1 之间,真正可做到“在保持快速编译和良好调试体验的同时,提供较为合理的优化级别”。 解决了如何生成满足 GDB 调试器要求的可执行文件,接下来正式学习 GDB 调试器的使用。 启动GDB调试器在生成包含调试信息的 main.exe 可执行文件的基础上,启动 GDB 调试器的指令如下:[root@bogon demo]# gdb main.exe GNU gdb (GDB) 8.0.1 Copyright (C) 2017 Free Software Foundation, Inc. ...... (gdb) 注意,该指令在启动 GDB 的同时,会打印出一堆免责条款。通过添加 --silent(或者 -q、--quiet)选项,可将比部分信息屏蔽掉:[root@bogon demo]# gdb main.exe --silent Reading symbols from main.exe...(no debugging symbols found)...done. (gdb) 无论使用以上哪种方式,最终都可以启动 GDB 调试器,启动成功的标志就是最终输出的 (gdb)。通过在 (gdb) 后面输入指令,即可调用 GDB 调试进行对应的调试工作。 GDB 调试器提供有大量的调试选项,可满足大部分场景中调试代码的需要。如表 1 所示,罗列了几个最常用的调试指令及各自的作用:
仍以 main.exe 可执行程序为例,接下来为读者演示表 1 中部分选项的功能和用法: (gdb) l <-- 显示带行号的源代码 1 #include <stdio.h> 2 int main () 3 { 4 unsigned long long int n, sum; 5 n = 1; 6 sum = 0; 7 while (n <= 100) 8 { 9 sum = sum + n; 10 n = n + 1; (gdb) <-- 默认情况下,l 选项只显示 10 行源代码,如果查看后续代码,安装 Enter 回车即可 11 } 12 return 0; 13 } (gdb) b 7 <-- 在第 7 行源代码处打断点 Breakpoint 1 at 0x400504: file main.c, line 7. (gdb) r <-- 运行程序,遇到断点停止 Starting program: /home/mozhiyan/demo1/main.exe Breakpoint 1, main () at main.c:7 7 while (n <= 100) Missing separate debuginfos, use: debuginfo-install glibc-2.17-55.el7.x86_64 (gdb) p n <-- 查看代码中变量 n 的值 $1 = 1 <-- 当前 n 的值为 1,$1 表示该变量所在存储区的名称 (gdb) b 12 <-- 在程序第 12 行处打断点 Breakpoint 2 at 0x40051a: file main.c, line 12. (gdb) c <-- 继续执行程序 Continuing. Breakpoint 2, main () at main.c:12 12 return 0; (gdb) p n <-- 查看当前 n 变量的值 $2 = 101 <-- 当前 n 的值为 101 (gdb) q <-- 退出调试 A debugging session is active. Inferior 1 [process 3080] will be killed. Quit anyway? (y or n) y <-- 确实是否退出调试,y 为退出,n 为不退出 [root@bogon demo]#
(编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |