如何调用gdbserver且不自动运行程序?BeagleBone Black远程调试
用GDB + GDBserver 调试BeagleBone Black上的崩溃进程
一、在BeagleBone Black上启动gdbserver
分两种场景操作,对应进程未启动和已崩溃挂起的情况:
场景1:从头启动待调试进程
如果进程还未运行,直接在BeagleBone Black终端执行:
# 以监听2345端口为例,可自定义端口;替换./crash_app为你的目标可执行文件 gdbserver :2345 ./crash_app
若进程需要传入启动参数,直接追加在可执行文件后:
gdbserver :2345 ./crash_app arg1 arg2
场景2:附加到已崩溃/挂起的进程
先通过进程名找到目标进程的PID:
ps aux | grep crash_app
再将gdbserver附加到该进程:
# 替换<PID>为查到的进程ID,端口保持和后续主机端一致 gdbserver :2345 --attach <PID>
启动成功后,gdbserver会输出如下提示,说明已处于监听状态:
Remote debugging using :2345
二、主机端使用GDB连接调试
1. 准备对应架构的交叉GDB
BeagleBone Black为ARM架构,若主机是x86_64架构,需使用ARM交叉编译工具链中的GDB(通常命名为arm-linux-gnueabihf-gdb,具体名称依你的工具链而定)。
2. 启动GDB并加载本地可执行文件
在主机终端运行:
# 加载本地的目标可执行文件,需和BeagleBone Black上的版本完全一致且带调试信息 arm-linux-gnueabihf-gdb ./crash_app
3. 连接到BeagleBone Black的gdbserver
进入GDB交互界面后,执行连接命令:
# 替换<BBB_IP>为BeagleBone Black的实际IP,端口和之前设置的保持一致 target remote <BBB_IP>:2345
4. 常规调试操作
连接成功后,即可像本地调试一样执行操作:
- 设置断点:
break main或break filename.c:line_number - 启动/恢复进程:从头启动的场景执行
continue;附加进程的场景直接操作即可 - 查看调用栈:
bt - 查看变量:
print <var_name> - 单步执行:
next/step
关键注意事项
- 确保主机与BeagleBone Black在同一网络,且目标板的监听端口未被防火墙拦截
- 本地的可执行文件必须和目标板上的完全一致,且编译时添加了
-g参数以包含调试信息,否则断点、变量查看等操作会异常
内容的提问来源于stack exchange,提问作者Myron Phan
相关产品推荐
相关产品推荐

