# ptrace_demo **Repository Path**: linyongwei/ptrace_demo ## Basic Information - **Project Name**: ptrace_demo - **Description**: 一个简易的调试器debugger - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2025-10-17 - **Last Updated**: 2025-10-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Ptrace调试器 一个基于ptrace系统调用的简单调试器实现,支持基本的调试功能。 ## 功能特性 - ✅ 进程启动和附加 - ✅ 断点设置和移除(支持地址和行号断点) - ✅ 单步执行 - ✅ 寄存器查看 - ✅ 内存读写 - ✅ 信号处理 - ✅ 进程分离 - ✅ **DWARF调试信息解析** - 源码行号与机器指令映射 - ✅ **栈帧回溯支持** - backtrace命令显示调用栈 - ✅ **符号解析** - 地址到函数名映射 - ✅ **源码级调试** - 基于行号的断点设置 ## 编译方法 ```bash # 编译调试器和测试程序 make all # 或者单独编译 make debugger make test_program ``` ## 使用方法 ### 1. 启动调试器 ```bash ./debugger ``` ### 2. 基本命令 ``` launch <程序> [参数] # 启动新程序(自动加载DWARF信息) attach # 附加到运行中的进程 continue # 继续执行 step # 单步执行 break <地址|行号> # 设置断点(支持地址和行号) backtrace # 显示调用栈(栈帧回溯) registers # 显示寄存器 quit # 退出 ``` ### 3. 示例调试会话(源码级调试) ```bash # 启动调试器 ./debugger # 启动带调试信息的程序(自动加载DWARF) debugger> launch ./test_stack # 设置行号断点(无需知道地址) debugger> break function_c:15 # 或者设置符号断点 debugger> break function_c # 继续执行到断点 debugger> continue # 查看调用栈 debugger> backtrace # 输出示例: # #0 function_c at test_stack.c:15 (0x400600) # #1 function_b at test_stack.c:10 (0x400580) # #2 function_a at test_stack.c:5 (0x400520) # 查看寄存器 debugger> registers # 单步执行 debugger> step # 退出调试器 debugger> quit ``` ## 技术实现 ### 核心ptrace调用 - `PTRACE_TRACEME` - 子进程请求被跟踪 - `PTRACE_ATTACH` - 附加到运行中的进程 - `PTRACE_CONT` - 继续执行 - `PTRACE_SINGLESTEP` - 单步执行 - `PTRACE_PEEKDATA/POKEDATA` - 内存读写 - `PTRACE_GETREGS/SETREGS` - 寄存器操作 ### 调试器核心技术 #### 断点实现原理 1. 保存原始指令 2. 写入INT3指令(0xCC) 3. 执行到断点时触发SIGTRAP信号 4. 恢复原始指令并单步执行 5. 重新设置断点 #### DWARF调试信息解析 - 解析ELF文件的.debug_info和.debug_line节区 - 建立源码行号到机器指令地址的映射表 - 支持基于行号的断点设置 - 自动识别可执行文件的实际源码文件名 #### 栈帧回溯算法 1. 通过RBP寄存器链式遍历调用栈 2. 解析每个栈帧的返回地址和栈指针 3. 使用符号表将地址映射回函数名 4. 结合DWARF信息显示源码位置 ## 文件结构 ``` ptrace_demo/ ├── debugger.h # 头文件 ├── debugger.c # 调试器实现(包含栈帧支持) ├── main.c # 主程序(支持backtrace命令) ├── symbols.c # 符号解析功能 ├── dwarf.c # DWARF调试信息解析 ├── test_program.c # 基础测试程序 ├── test_stack.c # 栈帧测试程序 ├── test_dwarf.c # DWARF功能测试程序 ├── Makefile # 编译配置 └── README.md # 说明文档 ``` ## 注意事项 1. **权限要求**: 附加到其他用户的进程需要root权限 2. **架构支持**: 当前支持x86和x86_64架构 3. **断点地址**: 需要知道准确的函数/指令地址 4. **信号处理**: 调试器会捕获所有信号,包括SIGSTOP、SIGCONT等 ## 测试方法 ### 基础功能测试 ```bash make test ./test_program ``` ### 栈帧功能测试 ```bash make test_stack ./debugger debugger> launch ./test_stack debugger> break function_c debugger> continue debugger> backtrace ``` ### DWARF功能测试 ```bash make test_dwarf ./test_dwarf ``` ## 扩展建议 - 添加反汇编功能 - 支持多线程调试 - 添加观察点功能 - 支持条件断点 - 添加内存断点(硬件断点) ## 许可证 MIT License