gdb远程调试
介绍
本文记录gdb远程调试方法,具体为参考开源项目进行gdbserver移植、简单指令实现。
移植前知识储备
gdbserver是运行在target机上的程序,用socket等方式与host机连接
例:socket连接命令
1 | target remote 127.0.0.1:1234 #本地的话冒号前可省略 |
在linux上运行通过 ptrace 与子进程通信来调试子程序,在Linux嵌入式等应用下则也有自己的方式,核心就行独立运行的gdbserver与程序通信,具体操作和命令通过socket传输。
简单指令实现
个人将gdbserver移植到模拟器程序中,初始化完成后在新开设的线程中持续执行接收、解码和返回数据。
gdb基本命令与传输的信息对应
1 | x 0xffff0000 是查看指定地址的数据,gdb remote 发送 'm' |
寄存器读取
通用寄存器的读取不通过指令主动读取(即’g’命令),gdb在halt前会自动发送读取,大概是因为程序受gdb管控期间这些寄存器不会改变。
发送i all-registers
指令可以获取部分指令寄存器值(即’p’命令)。
另外,不知道为什么arm架构下读取cpsr寄存器要读取0x16(25号寄存器),通常随通用寄存器读取
参考链接
- https://blog.csdn.net/HMSIWTV/article/details/8759129
- http://blog.sina.com.cn/s/blog_71ed04f70100qhxc.html
- gdb官方手册
- https://github.com/bet4it/gdbserver
- https://blog.csdn.net/giantpoplar/article/details/47657303
- https://blog.betamao.me/2019/02/02/Linux%E6%B2%99%E7%AE%B1%E4%B9%8Bptrace/
- 本文作者: Zheng Yuchen
- 本文链接: https://zycccccc.top/2021/03/29/gdb/gdb03-gdb远程调试/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!