GNU 调试器(GDB)是一个强大的调试工具,用于调试 C、C++ 和其他编程语言编写的程序。本文将全面介绍 GDB 的安装、基本使用方法、高级功能以及 Core Dump 调试,帮助你掌握这一重要的调试工具。
🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:
gylzbk
)
💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
【嵌入式】gdb调试工具:用于调试 C、C++ 和其他编程语言编写的程序,支持设置断点、单步执行、变量查看、堆栈跟踪、coredump调试等
1. GDB 简介
GDB 是 GNU 项目开发的调试器,支持多种编程语言,包括 C、C++、Fortran 等。GDB 提供了丰富的调试功能,如断点设置、单步执行、变量查看、堆栈跟踪等,使开发者能够高效地发现和修复程序中的错误。
2. 安装 GDB
2.1 在 Linux 上安装
在大多数 Linux 发行版上,可以通过包管理器安装 GDB。例如,在 Debian/Ubuntu 系统上,可以使用以下命令:
sudo apt update
sudo apt install gdb
在 Fedora 系统上,可以使用以下命令:
sudo dnf install gdb
2.2 在 macOS 上安装
在 macOS 系统上,可以使用 Homebrew 来安装 GDB。首先,确保你已经安装了 Homebrew,然后执行以下命令:
brew install gdb
安装完成后,需要对 GDB 进行签名以获得调试权限。创建一个新的代码签名证书,并将其应用到 GDB:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /usr/local/etc/gdb-cert.crt
codesign -s gdb-cert /usr/local/bin/gdb
2.3 在 Windows 上安装
在 Windows 系统上,可以使用 MinGW-w64 安装 GDB。首先,下载并安装 MinGW-w64,然后打开 MinGW-w64 Shell,执行以下命令:
pacman -S mingw-w64-x86_64-gdb
3. GDB 的基本使用
3.1 启动 GDB
可以通过在终端中输入 gdb
命令启动 GDB,并指定要调试的可执行文件:
gdb myprogram
3.2 设置断点
断点是调试过程中用于暂停程序执行的点。可以使用 break
命令设置断点:
(gdb) break main
还可以在指定的行号或函数名处设置断点:
(gdb) break 42
(gdb) break myfunction
3.3 运行程序
使用 run
命令运行程序:
(gdb) run
3.4 查看变量
使用 print
命令查看变量的值:
(gdb) print myvar
还可以使用 display
命令在每次停止时自动显示变量的值:
(gdb) display myvar
3.5 单步执行
使用 next
命令单步执行程序,跳过函数调用:
(gdb) next
使用 step
命令单步执行程序,进入函数调用:
(gdb) step
4. GDB 的高级功能
4.1 条件断点
可以设置条件断点,使断点只在特定条件满足时触发:
(gdb) break myfunction if myvar == 42
4.2 观察点
观察点用于在变量的值发生变化时暂停程序执行。使用 watch
命令设置观察点:
(gdb) watch myvar
4.3 堆栈跟踪
使用 backtrace
命令查看当前的堆栈跟踪:
(gdb) backtrace
4.4 调试多线程程序
GDB 支持调试多线程程序。使用 info threads
命令查看所有线程:
(gdb) info threads
使用 thread
命令切换到指定线程:
(gdb) thread 2
4.5 远程调试
GDB 支持远程调试,可以调试运行在其他机器上的程序。使用 target remote
命令连接到远程目标:
(gdb) target remote hostname:port
5. Core Dump 调试
Core Dump 是程序崩溃时生成的内存快照文件,包含了程序在崩溃时的状态信息。通过分析 Core Dump 文件,可以帮助开发者定位和修复程序中的错误。
5.1 Core Dump 的生成
在大多数 Linux 系统上,可以通过以下命令启用 Core Dump 生成:
ulimit -c unlimited
运行上述命令后,当程序崩溃时,系统会生成一个 Core Dump 文件。默认情况下,Core Dump 文件会生成在当前工作目录下,文件名通常为 core
或 core.<pid>
。
5.2 使用 GDB 调试 Core Dump
使用 GDB 打开 Core Dump 文件,并加载相应的可执行文件:
gdb myprogram core
加载 Core Dump 文件后,可以使用 GDB 的各种命令来分析程序崩溃时的状态。例如,使用 backtrace
命令查看堆栈跟踪:
(gdb) backtrace
还可以查看变量的值、设置断点、单步执行等,就像调试正在运行的程序一样。
6. GDB 脚本化
6.1 GDB 命令文件
可以将 GDB 命令保存到文件中,并在启动 GDB 时加载该文件:
gdb -x commands.gdb myprogram
6.2 GDB Python API
GDB 提供了 Python API,可以编写 Python 脚本来扩展 GDB 的功能。例如,以下是一个简单的 Python 脚本,用于在每次停止时打印当前堆栈帧的函数名:
import gdb
class PrintFunctionName(gdb.Command):
def __init__(self):
super(PrintFunctionName, self).__init__("print-func-name", gdb.COMMAND_USER)
def invoke(self, arg, from_tty):
frame = gdb.selected_frame()
print("Current function:", frame.name())
PrintFunctionName()
将上述代码保存到文件中,然后在 GDB 中使用 source
命令加载该文件:
(gdb) source myscript.py
7. GDB 常见问题及解决方法
问题一:无法设置断点
如果 GDB 无法设置断点,可能是因为可执行文件没有包含调试信息。请确保在编译时使用了 -g
选项:
gcc -g -o myprogram myprogram.c
问题二:GDB 无法启动或崩溃
如果 GDB 无法启动或崩溃,尝试更新 GDB 版本或重新安装 GDB。
8. 总结
本文详细介绍了 GDB 的安装、基本使用方法、高级功能以及 Core Dump 调试。通过阅读本文,你应该已经掌握了如何使用 GDB 进行调试,发现和修复程序中的错误。