说明:内容整理自C语言中文网
gdb -v 查看是否安装
自动安装:
sudo yum -y install gdb
手动安装:
wget http://ftp.gnu.org/gnu/gdb/gdb-13.2.tar.gz
./configure
make && make install
GDB 调试器无法直接安装到 Windows 平台上,如果想在 Windows 系统中使用 GDB 调试器,需要一个中间媒介,常用的就是 MinGW。
MinGw可以为我们提供一个功能有限的 Linux 系统环境以使用一些 GNU 工具。
在 Windows 平台上安装 GDB 调试器的过程,分为如下 2 个步骤:
安装完MinGW后,GDB的安装可以自动安装或手动安装,手动安装下载gdb程序后将exe放入到MinGW bin目录下,最后设置环境变量。
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)
gdb
此方式启动的 GDB 调试器,由于事先未指定要调试的具体程序,因此需启动后借助 file 或者 exec-file 命令指定(待补充)
gdb 可执行文件
同上面“基本使用方式"介绍
在某些情况下,我们可能想调试一个当前已经启动的程序,但又不想重启该程序,就可以借助 GDB 调试器实现。
1、找到可执行文件运行的进程id, pidof 文件名
2、执行以下三种方式的任意一种:gdb attach pid gdb -p pid gdb 可执行文件名 pid
当 GDB 调试器成功连接到指定进程上时,程序执行会暂停,此时可执行基本使用方式中的命令向下执行
当调试完成后,如果想令当前程序进行执行,消除调试操作对它的影响,需手动将 GDB 调试器与程序分离,分离过程分为 2 步:
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... 向可执行文件传递执行所需要的参数
根据不同场景的需要,GDB 调试器提供了多种方式来启动目标程序,其中最常用的就是 run 指令,其次为 start 指令。也就是说,run 和 start 指令都可以用来在 GDB 调试器中启动程序.
默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;
start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。
可以这样理解,使用 start 指令启动程序,完全等价于先在 main() 主函数起始位置设置一个断点,然后再使用 run 指令启动程序.
另外,程序执行过程中使用 run 或者 start 指令,表示的是重新启动程序。
借助file命令,可无需重启GDB调试器也能指定要调试的目标可执行文件
gdb -q(显示简略信息)
(gdb) file 可执行文件绝对路径
之后就可以进行调试了
有的程序执行,需要在启动时传递参数,gdb主要支持一下三种方式:
1、gdb --args main 参数信息
2、set args 参数信息
3、run 参数信息 start 参数信息
默认情况下,GDB 调试器的工作目录为启动时所使用的目录。GDB调试器的工作目录和目标调试文件不在同一目录时,会影响调试效率。
GDB 调试器提供有修改工作目录的指令,即 cd 指令,(gdb) cd /tmp/demo
,此时,GDB 调试器的工作目录就变成了 /tmp/demo。
某些场景中,目标调试程序的执行还需要临时修改 PATH 环境变量,此时就可以借助 path 指令。
(gdb) path /temp/demo
此时 /temp/demo就在PATH环境变量中了。此修改方式只是临时的,退出 GDB 调试后会失效。
默认情况下,GDB 调试的程序会接收 set args 等方式指定的参数,同时会将输出结果打印到屏幕上。
而通过对输入、输出重定向,可以令调试程序接收指定文件或者终端提供的数据,也可以将执行结果输出到文件或者某个终端上。
将 main 文件的执行结果输出到 a.txt 文件中,执行如下命令:run > a.txt
总的来说,只有将调试程序所需的运行环境搭建好后,才能使用 run 或者 start 命令开始调试。
pwd
gdb -q
cd 目标可执行文件路径
file 可执行文件
set args
run