交叉编译工具远程调试小结
我们在开发ARM板子C/C++项目过程中,我们会需要查找定位BUG,一种方式是通过网络发送日志;另一种方式是通过调试方式,而很多板子没有执行GDB性能,
因此我们需要远程调试的方式来进行调试。现在总结下项目中使用的两种方式。
调试可执行程序
- 环境准备:一台装有交叉编译工具链的机器A,一般是linux操作系统的机器;被调试程序的机器B上装有gdbserver
- 首先拷贝调试所需要的库及可执行程序到机器A上(【注】需要no-strip,带debug信息的库和可执行程序,可以通过
file
或info shared
查看) A机器准备gdb启动脚本.gdbinit,模板类似于:
123set solid-search-path [调试库目录]file [需要调试可执行程序]target remote [调试可执行程序的机器ip]:[gdbserver暴露出来的端口号]B机器准备gdbserver启动脚本,模板类似于:
1gdbserver :[暴露出来的端口号] 可执行程序A机器gdb启动后,紧接着启动B机器脚本;这个时候A机器的gdb窗口进入可调试状态,我们可以设置断点或者查看线程栈信息,输入
c
程序继续执行,Ctrl-c
进入打断状态
调试正在运行的进程
- 调试环境、拷贝相关库及可执行程序、A机器准备的gdb脚本和调试可执行程序相同,只是通过attach的方式来调试
- A机器gdb启动后,紧接着B机器执行如下命令:1gdbserver :[暴露出来的端口号] --attach [进程ID]
这个时候A机器的gdb窗口进入可调试状态。
这两种方式各有各的使用场景:调试可执行程序适合调试进程启动时候出现的BUG,调试正在运行的进程适合调试进程BUG已经出现的场景。