说明:内容整理自C语言中文网
1、 安装
1.1 Linux 下安装
gdb -v 查看是否安装
自动安装:
sudo yum -y install gdb
手动安装:
wget http://ftp.gnu.org/gnu/gdb/gdb-13.2.tar.gz
./configure
make && make install
1.2 Windows下安装
GDB 调试器无法直接安装到 Windows 平台上,如果想在 Windows 系统中使用 GDB 调试器,需要一个中间媒介,常用的就是 MinGW。
MinGw可以为我们提供一个功能有限的 Linux 系统环境以使用一些 GNU 工具。
在 Windows 平台上安装 GDB 调试器的过程,分为如下 2 个步骤:
- 下载并安装 MinGW
- 借助 MinGW 安装 GDB 调试器
安装完MinGW后,GDB的安装可以自动安装或手动安装,手动安装下载gdb程序后将exe放入到MinGW bin目录下,最后设置环境变量。
2、基本使用
GDB 的主要功能就是监控程序的执行流程。这也就意味着,只有当源程序文件编译为可执行文件并执行时,GDB 才会派上用场。
使用 GDB 调试某个可执行文件,该文件中必须包含必要的调试信息(比如各行代码所在的行号、包含程序中所有变量名称的列表(又称为符号表)等)。
生成可执行文件:
gcc main.c -o main -g
由此生成的 main,即可使用 GDB 进行调试
启动gdb调试
gdb main
该指令在启动 GDB 的同时,会打印出一堆免责条款。通过添加 --silent(或者 -q、--quiet)选项,可将比部分信息屏蔽掉
通过在 (gdb) 后面输入指令,即可调用 GDB 调试进行对应的调试工作
print(p) list(l) run(r) break(b) continue(c) quit(q) next(n)
3、gdb的四种使用方式
3.1 直接使用 gdb 指令启动 GDB 调试器
gdb
此方式启动的 GDB 调试器,由于事先未指定要调试的具体程序,因此需启动后借助 file 或者 exec-file 命令指定(待补充)
3.2 调试尚未执行的程序
gdb 可执行文件
同上面“基本使用方式"介绍
3.3 调试正在执行的程序
在某些情况下,我们可能想调试一个当前已经启动的程序,但又不想重启该程序,就可以借助 GDB 调试器实现。
1、找到可执行文件运行的进程id, pidof 文件名
2、执行以下三种方式的任意一种:gdb attach pid gdb -p pid gdb 可执行文件名 pid
当 GDB 调试器成功连接到指定进程上时,程序执行会暂停,此时可执行基本使用方式中的命令向下执行
当调试完成后,如果想令当前程序进行执行,消除调试操作对它的影响,需手动将 GDB 调试器与程序分离,分离过程分为 2 步:
- 执行 detach 指令,使 GDB 调试器和程序分离;
- 执行 quit(或 q)指令,退出 GDB 调试。
3.4 调试执行异常崩溃的程序
C 或者 C++ 程序运行过程中常常会因为各种异常或者 Bug 而崩溃,比如内存访问越界、非法使用空指针等,此时就需要调试程序。
在 Linux 操作系统中,当程序执行发生异常崩溃时,系统可以将发生崩溃时的内存数据、调用堆栈情况等信息自动记录下载,并存储到一个文件中,该文件通常称为 core 文件,Linux 系统所具备的这种功能又称为核心转储(core dump)。
GDB 对 core 文件的分析和调试提供有非常强大的功能支持,当程序发生异常崩溃时,通过 GDB 调试产生的 core 文件,往往可以更快速的解决问题。
默认情况下,Linux 系统是不开启 core dump 这一功能的,借助执行ulimit -a 指令来查看当前系统是否开启此功能。
如果 core file size(core 文件大小)对应的值为 0,表示当前系统未开启 core dump 功能,通过执行ulimit -c unlimited指令改变 core 文件的大小,由此,当程序执行发生异常崩溃时,系统就可以自动生成相应的 core 文件。
查看命令 ulimit -a
修改大小命令 ulimit -c unlimited
调试结束后可以恢复,将文件大小置为0 ulimit -c 0
默认情况下,core 文件的生成位置同该程序所在的目录相同,也可以指定 core 文件的生成的位置。
对于 core 文件的调试,其调用 GDB 调试器的指令为:
gdb 可执行文件 core文件name
对于 core 文件中记录的崩溃信息,可以使用 where、print、bt 等指令查看
GDB 调试器时常用的指令参数:
调试进程 ID 为 number 的程序 -p(pid) number
取消启动 GDB 调试器时打印的介绍信息和版权信息
-q
-quiet
-silent
-cd directory 以 directory 作为启动 GDB 调试器的工作目录,而非当前所在目录
--args 参数1 参数2... 向可执行文件传递执行所需要的参数
4、启动程序 gdb run
根据不同场景的需要,GDB 调试器提供了多种方式来启动目标程序,其中最常用的就是 run 指令,其次为 start 指令。也就是说,run 和 start 指令都可以用来在 GDB 调试器中启动程序.
-
默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;
-
start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。
可以这样理解,使用 start 指令启动程序,完全等价于先在 main() 主函数起始位置设置一个断点,然后再使用 run 指令启动程序.
另外,程序执行过程中使用 run 或者 start 指令,表示的是重新启动程序。
4.1 手动指定执行程序的启动方式
借助file命令,可无需重启GDB调试器也能指定要调试的目标可执行文件
gdb -q(显示简略信息)
(gdb) file 可执行文件绝对路径
之后就可以进行调试了
4.2 传递启动参数
有的程序执行,需要在启动时传递参数,gdb主要支持一下三种方式:
- 启动 GDB 调试器时,可以在指定目标调试程序的同时,使用 --args 选项指定需要传递给该程序的数据
- GDB 调试器启动后,可以借助 set args 命令指定目标调试程序启动所需要的数据
- 使用 run 或者 start 启动目标程序时,指定其所需要的数据
1、gdb --args main 参数信息
2、set args 参数信息
3、run 参数信息 start 参数信息
4.3 设置调试器的工作目录
默认情况下,GDB 调试器的工作目录为启动时所使用的目录。GDB调试器的工作目录和目标调试文件不在同一目录时,会影响调试效率。
GDB 调试器提供有修改工作目录的指令,即 cd 指令,(gdb) cd /tmp/demo
,此时,GDB 调试器的工作目录就变成了 /tmp/demo。
4.4 临时修改 PATH 环境变量
某些场景中,目标调试程序的执行还需要临时修改 PATH 环境变量,此时就可以借助 path 指令。
(gdb) path /temp/demo
此时 /temp/demo就在PATH环境变量中了。此修改方式只是临时的,退出 GDB 调试后会失效。
4.5 重定向
默认情况下,GDB 调试的程序会接收 set args 等方式指定的参数,同时会将输出结果打印到屏幕上。
而通过对输入、输出重定向,可以令调试程序接收指定文件或者终端提供的数据,也可以将执行结果输出到文件或者某个终端上。
将 main 文件的执行结果输出到 a.txt 文件中,执行如下命令:run > a.txt
4.6 总结
总的来说,只有将调试程序所需的运行环境搭建好后,才能使用 run 或者 start 命令开始调试。
pwd
gdb -q
cd 目标可执行文件路径
file 可执行文件
set args
run