gdb简易教程
What is gdb
GDB的全称是“GNU symbolic debugger”,从名称可以看出,它属于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。
gdb的安装
#install gdb $ sudo apt-get install -y gdb #print gdb's version $ gdb -v
gdb的简单调试
以下面一段代码main.c为例子
#includeint main () { unsigned long long int n, sum; n = 1; sum = 0; while (n <= 100) { sum = sum + n; n = n + 1; } return 0; }
启动gdb
# 编译,-g参数打开gdb调试功能 $ gcc main.c -o main.exe -g $ gdb main.exe GNU gdb (GDB) 8.0.1 Copyright (C) 2017 Free Software Foundation, Inc. ...... (gdb)
注意,该指令在启动 GDB 的同时,会打印出一堆免责条款。通过添加 --silent(或者 -q、--quiet)选项,可将比部分信息屏蔽掉:
$ gdb main.exe --silent Reading symbols from main.exe...(no debugging symbols found)...done. (gdb)
gdb常用调试命令
调试指令 作 用
(gdb) break xxx
(gdb) b xxx 在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置。
(gdb) run
(gdb) r 执行被调试的程序,其会自动在第一个断点处暂停执行。
(gdb) continue
(gdb) c 当程序在某一断点处停止运行后,使用该指令可以继续执行,直至遇到下一个断点或者程序结束。
(gdb) next
(gdb) n 令程序一行代码一行代码的执行。
(gdb) print xxx
(gdb) p xxx 打印指定变量的值,其中 xxx 指的就是某一变量名。
(gdb) list
(gdb) l 显示源程序代码的内容,包括各行代码所在的行号。
(gdb) quit
(gdb) q 终止调试。
如上所示,每一个指令既可以使用全拼,也可以使用其首字母表示。另外,表 1 中罗列的指令仅是冰山一角,GDB 还提供有大量的选项,可以通过 help 选项来查看。
下面以 main.exe 可执行程序为例,接下来为演示部分选项的功能和用法
(gdb) l <-- 显示带行号的源代码 1 #include2 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]#