# Linux程序调试工具gdb怎么使用 ## 一、gdb简介 GDB(GNU Debugger)是GNU项目开发的强大调试工具,支持多种编程语言(C/C++/Go等),是Linux环境下最常用的程序调试工具之一。它可以帮助开发者: 1. 启动程序并指定运行参数 2. 设置断点使程序在特定位置暂停 3. 单步执行代码 4. 查看变量值和内存状态 5. 分析程序崩溃时的核心转储文件 6. 动态修改程序执行流程 ### 1.1 gdb的安装 在大多数Linux发行版中,可以通过包管理器安装: ```bash # Ubuntu/Debian sudo apt-get install gdb # CentOS/RHEL sudo yum install gdb # Arch Linux sudo pacman -S gdb
验证安装:
gdb --version
使用gcc/g++编译时需要添加-g
选项生成调试信息:
gcc -g main.c -o demo # 或者 g++ -g main.cpp -o demo
基本启动方式:
gdb [可执行文件]
带参数启动程序:
gdb --args ./demo arg1 arg2
命令 | 简写 | 功能说明 |
---|---|---|
run | r | 开始执行程序 |
break | b | 设置断点 |
continue | c | 继续执行直到下一个断点 |
next | n | 单步执行(不进入函数) |
step | s | 单步执行(进入函数) |
p | 打印变量值 | |
backtrace | bt | 显示函数调用栈 |
quit | q | 退出gdb |
设置断点:
# 在函数处设置断点 (gdb) b main (gdb) b MyClass::myMethod # 在文件行号处设置断点 (gdb) b main.c:15 # 在地址处设置断点 (gdb) b *0x4005a3
查看断点:
(gdb) info breakpoints
删除断点:
(gdb) delete 2 # 删除编号为2的断点 (gdb) delete # 删除所有断点
条件断点:
(gdb) b 25 if i==100
启动程序:
(gdb) run (gdb) r arg1 arg2 # 带参数运行
继续执行:
(gdb) continue (gdb) c 10 # 忽略当前断点10次
单步执行:
(gdb) next # 不进入函数 (gdb) step # 进入函数
直到当前函数返回:
(gdb) finish
打印变量:
(gdb) p variable (gdb) p *ptr@10 # 打印指针指向的10个元素 (gdb) p/x var # 十六进制格式 (gdb) p/d var # 十进制格式
修改变量:
(gdb) set var i=10 (gdb) set var ptr=0x7fffffffe2a0
查看内存:
(gdb) x/10xb ptr # 查看10字节内存(十六进制) (gdb) x/20dw array # 查看20个4字节字(十进制)
查看调用栈:
(gdb) backtrace (gdb) bt 5 # 只显示最近5帧
切换栈帧:
(gdb) frame 2 (gdb) up # 上一帧 (gdb) down # 下一帧
查看帧信息:
(gdb) info frame 2
查看线程:
(gdb) info threads
切换线程:
(gdb) thread 3
锁定线程:
(gdb) set scheduler-locking on
设置观察点:
(gdb) watch var # 变量修改时中断 (gdb) rwatch var # 变量读取时中断 (gdb) awatch var # 变量读写时中断
查看观察点:
(gdb) info watchpoints
捕获异常/信号:
(gdb) catch throw # 捕获C++异常 (gdb) catch syscall # 捕获系统调用 (gdb) catch signal # 捕获信号
ulimit -c unlimited ./buggy_program
gdb ./buggy_program core
(gdb) bt (gdb) frame N
gdb -p <pid>
(gdb) thread apply all bt
结合valgrind使用:
valgrind --leak-check=full --show-leak-kinds=all ./program
在gdb中检查内存:
(gdb) x/100bx malloc_ptr # 检查malloc分配的内存
gdb-dashboard:可视化调试界面
git clone https://github.com/cyrus-and/gdb-dashboard.git echo "source ~/gdb-dashboard/.gdbinit" >> ~/.gdbinit
pwndbg:专注于二进制漏洞利用的插件
git clone https://github.com/pwndbg/pwndbg cd pwndbg && ./setup.sh
DDD:Data Display Debugger
sudo apt-get install ddd ddd ./program
Eclipse CDT:集成开发环境中的gdb前端
VS Code:通过C/C++扩展使用gdb
记录执行过程并反向执行:
(gdb) target record (gdb) continue (gdb) reverse-step (gdb) reverse-continue
在gdb中使用Python:
(gdb) python print("Hello from Python")
自定义命令示例:
class MyCommand(gdb.Command): def __init__(self): super().__init__("mycmd", gdb.COMMAND_USER) def invoke(self, arg, from_tty): print("Executing with arg:", arg) MyCommand()
使用gdbserver进行远程调试:
# 目标机器 gdbserver :1234 ./program # 开发机器 gdb ./program (gdb) target remote target_ip:1234
-Og
优化级别(gcc 4.8+)-O2
或更高优化症状:
No symbol table is loaded. Use the "file" command.
解决方案: 1. 确保编译时使用了-g
选项 2. 检查是否strip了调试信息 3. 确认gdb版本与编译器兼容
调试fork出的子进程:
(gdb) set follow-fork-mode child (gdb) set detach-on-fork off
常用配置:
# 打印美化 set print pretty on set print object on # 历史记录 set history save on set history filename ~/.gdb_history # 自动化脚本 define hook-run break main end
定义快捷命令:
define pr print $arg0 end document pr Print the value of an expression Usage: pr EXPR end
GDB是Linux开发者不可或缺的强大工具,掌握它可以:
建议的学习路径: 1. 从基础命令开始,熟练使用断点、单步执行 2. 掌握变量查看和修改技巧 3. 学习多线程和核心转储分析 4. 尝试Python扩展和自定义命令 5. 探索高级功能如反向调试
通过持续实践,gdb将成为你解决复杂问题的得力助手。
命令 | 功能说明 |
---|---|
info breakpoints | 查看所有断点 |
info registers | 查看寄存器值 |
info locals | 查看局部变量 |
disassemble | 反汇编当前函数 |
show commands | 显示历史命令 |
tbreak | 设置临时断点 |
ignore N count | 忽略断点N count次 |
return | 强制从当前函数返回 |
jump | 跳转到指定位置执行 |
generate-core-file | 生成核心转储文件 |
”`
这篇文章共计约4800字,涵盖了gdb从基础到高级的各个方面,包括安装配置、基本命令、高级技巧、实战示例和常见问题解决方案。采用Markdown格式编写,结构清晰,便于阅读和参考。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。