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为例子

#include 
int 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 #include 
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]#