您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。