gdb使用总结

说明:内容整理自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 个步骤:

  1. 下载并安装 MinGW
  2. 借助 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 步:

  1. 执行 detach 指令,使 GDB 调试器和程序分离;
  2. 执行 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 调试器中启动程序.

  1. 默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;

  2. start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。

可以这样理解,使用 start 指令启动程序,完全等价于先在 main() 主函数起始位置设置一个断点,然后再使用 run 指令启动程序.

另外,程序执行过程中使用 run 或者 start 指令,表示的是重新启动程序。

4.1 手动指定执行程序的启动方式

借助file命令,可无需重启GDB调试器也能指定要调试的目标可执行文件

gdb -q(显示简略信息)
(gdb) file 可执行文件绝对路径

之后就可以进行调试了

4.2 传递启动参数

有的程序执行,需要在启动时传递参数,gdb主要支持一下三种方式:

  1. 启动 GDB 调试器时,可以在指定目标调试程序的同时,使用 --args 选项指定需要传递给该程序的数据
  2. GDB 调试器启动后,可以借助 set args 命令指定目标调试程序启动所需要的数据
  3. 使用 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

你可能感兴趣的:(Linux,linux,gdb)