gdb

如何让可执行文件支持gdb调试,该文件中必须包含必要的调试信息(比如各行代码所在的行号,包含程序中所有变量名称的列表(符号表)),在使用cc(gcc)编译时需要带上-g参数,如下:

gcc -g main.c -o main

gdb 使用命令

  1. 启动gdb调试器
  • 直接使用gdb指令启动调试器

    gdb
    此方式启动的 GDB 调试器,由于事先未指定要调试的具体程序,因此需启动后借助 file 或者 exec-file 命令指定(后续章节会做详细讲解)

  • 调试尚未运行的程序
    对于具备调试信息(使用 -g 选项编译而成)的可执行文件,调用 GDB 调试器的指令格式为:

    gdb program

  • 调试正在执行的程序
    在某些情况下,我们可能想调试一个当前已经启动的程序,但又不想重启该程序,就可以借助 GDB 调试器实现。
    GDB 可以调试正在运行的 C、C++ 程序。要知道,每个 C 或者 C++ 程序执行时,操作系统会使用 1 个(甚至多个)进程来运行它,并且为了方便管理当前系统中运行的诸多进程,每个进程都配有唯一的进程号(PID)。

    gdb -p pid
    gdb attach pid
    gdb 文件名 pid
    可以通过pidof 文件名 或者pgrep 文件名找到对应的进程id

    当 GDB 调试器成功连接到指定进程上时,程序执行会暂停

相关参数:

  • –silent 或者 -q 或者 -quiet 表示不显示免责条款
  • -p pid 表示使用gdb调试一个正在运行的进程
  • -cd directory 以directory作为启动gdb调试器的工作目录,而非当前所在目录
  • args 参数1 参数2… 向可执行文件传递执行所需的参数
  1. gdb 命令
  • list / l 显示程序代码的内容,包括各行代码所在的行号. 默认情况下,l 选项只显示 10 行源代码,如果查看后续代码,安装 Enter 回车即可
[root@iz2zecj7a5r32f2axsctb9z test]# gdb v11 -q
Reading symbols from /root/shell/test/v11...done.
(gdb) list
1    #include <stdio.h>
2    #include <stdlib.h>
3    
4    int main() {
5    
6        int i = 10;
7        int *a = &i;
8        *a = NULL;
9    
10        return 0;
(gdb) 
  • break xxx / b xxx 在源代码指定的某一行设置断点,其中xxx用于指定具体打断点的位置
    b 8 表示在源代码第8行打上断点

    [root@iz2zecj7a5r32f2axsctb9z test]# gdb v11 -q
    Reading symbols from /root/shell/test/v11...done.
    (gdb) list
    ...
    (gdb) l
    (gdb) b 8     
    Breakpoint 1 at 0x400500: file v11.c, line 8.
    (gdb) 
  • run / r 执行被调试的程序,其会自动在第一个断点处暂停执行

  • continue / c 当程序在某个断点处停止运行后,使用该指令可以继续执行,直到遇到下一个断点或者程序结束

  • next / n 令程序一行一行代码的执行

  • print xxx / p xxx 打印指定变量的值,其中xxx指的就是某个变量名

  • quit / q 终止调试

文档更新时间: 2021-03-10 12:49   作者:周国强