我们在开发ARM板子C/C++项目过程中,我们会需要查找定位BUG,一种方式是通过网络发送日志;另一种方式是通过调试方式,而很多板子没有执行GDB性能,
因此我们需要远程调试的方式来进行调试。现在总结下项目中使用的两种方式。

调试可执行程序

  1. 环境准备:一台装有交叉编译工具链的机器A,一般是linux操作系统的机器;被调试程序的机器B上装有gdbserver
  2. 首先拷贝调试所需要的库及可执行程序到机器A上(【注】需要no-strip,带debug信息的库和可执行程序,可以通过fileinfo shared查看)
  3. A机器准备gdb启动脚本.gdbinit,模板类似于:

    1
    2
    3
    set solid-search-path [调试库目录]
    file [需要调试可执行程序]
    target remote [调试可执行程序的机器ip]:[gdbserver暴露出来的端口号]
  4. B机器准备gdbserver启动脚本,模板类似于:

    1
    gdbserver :[暴露出来的端口号] 可执行程序
  5. A机器gdb启动后,紧接着启动B机器脚本;这个时候A机器的gdb窗口进入可调试状态,我们可以设置断点或者查看线程栈信息,输入c程序继续执行,Ctrl-c进入打断状态

调试正在运行的进程

  1. 调试环境、拷贝相关库及可执行程序、A机器准备的gdb脚本和调试可执行程序相同,只是通过attach的方式来调试
  2. A机器gdb启动后,紧接着B机器执行如下命令:
    1
    gdbserver :[暴露出来的端口号] --attach [进程ID]

这个时候A机器的gdb窗口进入可调试状态。

这两种方式各有各的使用场景:调试可执行程序适合调试进程启动时候出现的BUG,调试正在运行的进程适合调试进程BUG已经出现的场景。