在开始调试前,需要确保具备以下条件: - 交叉编译工具链(如arm-linux-gnueabihf-) - 目标ARM设备的GDB服务器(gdbserver) - 主机上的ARM架构GDB客户端(arm-linux-gnueabihf-gdb) - 目标程序的可执行文件和带调试符号的版本
arm-linux-gnueabihf-gcc -g -o my_program my_program.c
scp my_program user@target_ip:/path/to/target
# 在目标设备上执行
gdbserver :2345 /path/to/target/my_program
或者附加到正在运行的进程:
gdbserver :2345 --attach <pid>
arm-linux-gnueabihf-gdb my_program
在GDB命令行中:
(gdb) target remote target_ip:2345
(gdb) set sysroot /path/to/target/rootfs
(gdb) set solib-absolute-prefix /path/to/target/rootfs
(gdb) set solib-search-path /path/to/target/libs
(gdb) hbreak function_name
(gdb) info registers
(gdb) p $r0
(gdb) disassemble
创建~/.gdbinit或项目目录下的.gdbinit文件,自动加载常用配置:
set sysroot /path/to/target/rootfs
set solib-absolute-prefix /path/to/target/rootfs
set solib-search-path /path/to/target/libs
(gdb) set scheduler-locking on # 锁定当前线程
(gdb) info threads # 查看所有线程
(gdb) thread <num> # 切换线程
对于复杂的远程调试场景,可以配置SSH端口转发:
ssh -L 2345:localhost:2345 user@target_ip
然后在GDB中连接本地端口:
(gdb) target remote localhost:2345
确保主机上的可执行文件与目标设备上的完全一致(包括编译选项)
使用set sysroot
和set solib-*
命令正确设置库路径
可以考虑使用以下图形化前端简化调试: - Eclipse CDT - DDD (Data Display Debugger) - Nemiver - Qt Creator
这些工具通常提供更直观的界面,但底层仍使用GDB作为调试引擎。