Home gdb介绍
Post
Cancel

gdb介绍

GDB(GNU调试器)是Linux系统环境中广泛使用的调试器之一,用于调试应用程序甚至linux内核。 GDB提供了一套命令行界面,使开发者能够在调试过程中检查程序的内部状态、变量的值以及执行流程。

一些关于GDB的重要特性和用法:

  1. 调试程序:GDB允许在程序执行过程中暂停,并逐步执行代码。可以在特定的断点处停下,检查变量的值,跟踪函数调用,并在程序崩溃时进行检查。

  2. 设置断点:使用GDB,可以设置断点以在程序执行到指定位置时暂停。断点可以是函数名称、源文件行号或内存地址。

  3. 检查变量和内存:在程序执行时,使用GDB检查变量的当前值和表达式的结果。可以打印变量的值、修改变量的内容,并监视内存中的数据。

  4. 回溯和追踪函数调用:GDB可以跟踪函数的调用和返回过程。查看函数的调用堆栈,了解程序执行的上下文。

  5. 内存泄漏检查:GDB可以帮助检测和调试内存泄漏问题。跟踪动态分配的内存,找出未释放的内存块,并识别潜在的内存泄漏点。

  6. 多线程调试:GDB支持多线程程序的调试。您可以控制每个线程的执行,观察线程的状态,并检查线程间的同步和通信。

  7. 脚本扩展:GDB提供了一种称为GDB脚本的扩展机制,允许用户编写自定义命令和自动化调试任务。

在Linux系统中,您可以通过在终端中运行gdb命令来启动GDB。进入GDB的交互界面,可以使用各种命令进行程序的调试和分析。 通过输入help来获取关于GDB命令的帮助信息。

安装

如果没有安装gdb调试工具,可以直接从软件源安装,以下是在centos7系统中安装。

1
2
3
sudo yum update
sudo yum install gdb
gdb --version

安装成功,可以显示gdb版本信息,之后可以通过gdb命令来启动gdb调试器。

前置要求

使用GDB调试应用程序时,编译应用程序时的一些要求和建议如下:

  1. 启用调试信息:在编译应用程序时,确保启用了调试信息的生成。在GCC编译器中,常用的选项是-g,它会生成包含调试符号的可执行文件。

  2. 禁用优化:优化可能会改变代码的执行流程和变量的值,使得调试更加困难。在GCC中,您可以使用-O0选项来禁用优化。

  3. 保留源代码:保留原始的源代码文件,这样在调试过程中可以查看和分析源代码。

  4. 调试信息符号表:除了生成调试信息外,还需要确保应用程序的可执行文件包含符号表。符号表包含了函数、变量和类型的信息, 使得GDB能够正确解析和显示这些符号。在GCC中,可以使用-rdynamic选项来生成完整的符号表。

  5. 关闭优化器特性:有时,一些编译器优化特性可能会干扰调试过程,可以尝试使用编译器选项来禁用特定的优化特性。

参考编译选项:

1
CFLAGS += -O0 -g3 -rdynamic

补充:为何使用-g选项时,最好使用 -O0

程序如果在编译时开启了优化选项,在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误的情况。 这是正常的,因为优化程序会删改你的程序,整理你程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时, 运行时的指令和所编写指令就有不一样,也就会出现想象不到的结果。

启动方式

调试新程序

建议直接使用如下命令启动gdb并装载指定程序。

1
gdb [path/to/program]

也可以分2步,启动并手动加载

1
2
gdb
(gdb) file [your program name]

调试已经在运行的程序

对于已经在运行的程序,如果不想重启程序调试,gdb也是可以“附着”上去并进行调试的。 假设运行中的程序的pid为1234,则这样启动将gdb“附着”到程序上。

1
2
3
gdb -p 1234
gdb [path/to/program] 1234
# 还可以gdb启动后使用attach指令去进行“附着”

gdb“附着”成功后,程序会暂定下来。

调试完毕后,可以在gdb中输入detach指令分离程序。或是输入 q直接全部退出。

调试已崩溃退出的程序

需要使用core转储文件。核心转储文件是在程序崩溃时生成的,记录了崩溃时的程序状态。 GDB将加载核心转储文件并进入交互调试模式,以分析崩溃时的程序状态。

1
2
3
gdb -c [/path/to/corefile] [/path/to/myprogram] 
# 或
gdb [/path/to/myprogram] [/path/to/corefile] 

在 Linux 操作系统中,当程序执行发生异常崩溃时,系统可以将发生崩溃时的内存数据、调用堆栈情况等信息保存到一个文件中, 该文件通常称为 core 文件,Linux 系统所具备的这种功能又称为核心转储(core dump)。

core dump文件主要包含程序的内存映像(包括堆、栈和全局变量的内容)和寄存器状态。对于分析崩溃程序很有帮助。 核心转储core dump功能,linux系统是默认没有开启的,里面可能会保存程序的敏感数据。

查看核心转储开关状态:(使用ulimit命令,这是bash内置的命令,使用help bash 搜索ulimit查看帮助)

1
2
# -c	: the maximum size of core files created
ulimit -c

如果输出为0,则表示核心转储已禁用。可以使用以下命令启用核心转储:

1
2
# unlimited 表示不限制 core 文件的大小。
ulimit -c unlimited

在程序或操作系统遇到严重错误时,它可能会崩溃并生成核心转储文件。例如,当程序访问无效的内存地址或发生段错误时,通常会导致程序崩溃并生成核心转储文件。 当程序崩溃时,核心转储文件会自动生成。它的默认名称是core,存储在当前工作目录中。

随后可以使用gdb调试core文件,通常可以使用 bt指令查看栈回溯信息,使用info registers查看崩溃时的寄存器信息,还可以使用 print指令查看一些 关键变量的值等。

参考

man gdb

This post is licensed under CC BY 4.0 by the author.

FTP协议及相关工具

gdb常用指令一