gdb调试是一个功能强大的命令调试程序,一般来说,GDB主要可以完成下面四个方面的功能: 
1、启动被测程序,可以按照自定义策略运行代码。 
2、可以设置断点,控制程序运行。(断点可以是条件表达式) 
3、当程序被停住时,可以检查程序运行情况。 
4、动态的改变程序的执行环境

首先,需要安装 gdb:

$ sudo apt install gdb

检验是否成功安装:

$ gdb --version / -v

 显示如下代表安装成功。

在使用gdb调试前,以c程序为例,若需要对c代码进行 gdb 调试,那么在生成目标文件时要注意加入-g,代表支持 gdb 调试。样例如下:

如下为 test.c 的代码内容:

#include <stdio.h>
#define N 100
int func(int num){
    num += 10;
    return num;
}
int main(){
    for(int i = 0; i < N; i++){
        printf("current number is : %d\n", func(i));
    }
    return 0;
}

首先用 gcc 对代码进行编译,生成可执行文件 test :

$ gcc test.c -g -o test

 然后使用如下命令启动 gdb 调试。

$ gdb [options] [executable_file [core_file | process_id]]
# 直接指定可执行文件
$ gdb test
# 在程序名称后面附加参数,可以指定要调试的进程ID,或者指定核心转储文件的名称
$ gdb test 1001

实际效果如下: 

 接下来,就可以通过一系列的操作对程序进行调试

# 显示所有处理器寄存器的内容,包括浮点和向量寄存器
$ (gdb) info all-reg
# 显示当前的源文件
$ (gdb) info source
# 显示 radius 变量的地址信息
$ (gdb) info address radius
#显示GDB当前日志的相关信息
$ (gdb) show loggin
# 将GDB的日志重定向到gdb.txt文件
$ (gdb) set logging on
#如果gdb在启动时没有指定被调试程序,可以通过file指定被调试的程序
$ (gdb) file filename
# 重新指定被调试程序的命令行参数。
$ (gdb) set args [arguments]
# 显示被调试程序的命令行参数
$ (gdb) show args
# 开始执行一个程序,并可选的为其指定命令行参数
$ (gdb) run / r [arguments]
# 终止被调试的程序 (不会销毁当前设置的参数)
$ (gdb) kill
# 显示源代码,并以指定的行作为中心
$ (gdb) list filename:line_number
# 跳转到指定的行(为中心)
$ (gdb) line_number
# 显示特定范围内的源代码
$ (gdb) from  , [to]
# 把指定函数开始的第一行作为中心,显示源代码
$ (gdb) function_name
# 显示更多的行(遇到断点中止)
$ (gdb) list / l
# 设置list命令默认输出行数
$ (gdb) set listsize number
# 显示list命令默认输出的行数
$ (gdb) listsize
# 在(指定文件或当前文件)指定行设置断点
$ (gdb) break [filename:] line_number
# 在指定函数的第一行设置断点
$ (gdb) break function
# 在当前栈帧的下一行设置断点
$ (gdb) break
# 显示断点信息,包括断点编号、断点位置等
$ (gdb) info breakpoints 
# 设置临时断点
$ (gdb) tbreak 16
# 继续执行到下一个断点,passes表示忽略几次中断
$ (gdb) continue / c [passes]
# 执行多少行后再次被中断,如果遇到函数,将会进入函数,并在函数第一行停下来
$ (gdb) step / s [lines]
# 执行多少行后再次被中断,不会进入函数
$ (gdb) next / n [lines]
# 删除指定编号或指定范围的断点,不带参数会删除所有断点。例如"delete 1-3"
$ (gdb) delete / d [bp_number | range]
# 禁用断点
$ (gdb) disable [bp_number | range]
# 启用断点
$ (gdb) enable [bp_number | range]
# 忽略断点,并指定忽略次数为iterations
$ (gdb) ignore bp_number iterations
# 将当前函数执行结束,控制权返回给函数调用者
$ (gdb) finish
# 多个命令都可以显示程序的调用轨迹
$ (gdb) backtrace, bt, where, info stack
# 显示当前栈帧,或者选择不同的栈帧
$ (gdb) frame [number]
# 显示当前栈帧的相关信息
$ (gdb) info frame
# 当前栈帧的局部变量
$ (gdb) info locals
# 列出对应函数调用的参数值
$ (gdb) info args

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐