GDB 与 GDBServer 远程调试基础命令详解
一、环境准备
-
目标机(嵌入式设备)
-
安装
gdbserver
(如arm-linux-gnueabihf-gdbserver
) -
启动
gdbserver
并监听端口:复制gdbserver :2345 /path/to/program [args] # 监听本地2345端口,运行程序
-
若调试已运行进程:
复制gdbserver :2345 --attach <PID> # 附加到进程ID
-
-
主机(开发机)
-
安装交叉编译工具链的 GDB(如
arm-linux-gnueabihf-gdb
) -
启动 GDB 并加载程序:
复制arm-linux-gnueabihf-gdb ./program
-
二、连接与调试基础命令
命令 |
作用 |
示例 |
---|---|---|
|
连接到目标机的 GDBServer |
|
|
加载可执行文件(需与目标机程序一致) |
|
|
显示源码(默认显示当前位置前后10行) |
|
|
设置断点(函数名、行号、内存地址) |
|
|
启动程序执行(带参数可用 |
|
|
从断点继续执行至下一个断点或程序结束 |
|
|
单步执行(进入函数内部) |
|
|
单步执行(不进入函数) |
|
|
打印变量值(支持格式控制,如 |
|
|
查看调用栈(显示函数调用链) |
|
|
列出所有断点信息 |
|
|
删除指定断点 |
|
|
继续执行至当前函数返回 |
|
三、调试场景示例
-
设置断点并单步调试
复制(gdb) break main.c:10 # 在 main.c 第10行设置断点 (gdb) run # 启动程序 (gdb) step # 进入函数内部 (gdb) next # 跳过函数调用 (gdb) p count # 打印变量 count 的值
-
查看内存与寄存器
-
查看内存内容:
复制(gdb) x/4xw 0x20001000 # 从地址0x20001000读取4个32位字(十六进制)
-
查看寄存器:
复制(gdb) info registers # 显示所有寄存器值
-
-
条件断点与观察点
-
条件断点(当变量
i == 5
时触发):复制(gdb) break 20 if i == 5
-
监控变量变化:
复制(gdb) watch my_var # 当 my_var 值变化时暂停
-
四、高级调试技巧
-
远程调试附加进程
复制(gdb) target remote :2345 # 连接到本地2345端口(默认)
-
加载核心转储文件
复制(gdb) core-file core.dump # 加载崩溃时的核心转储文件
-
多线程调试
-
查看线程列表:
复制(gdb) info threads
-
切换线程:
复制(gdb) thread 2 # 切换到线程2
-
五、常见问题解决
-
无法加载符号
-
确保编译时添加
-g
选项(保留调试信息)。 -
使用
file
命令重新加载程序。
-
-
连接失败
-
检查防火墙是否放行端口(如
2345
)。 -
确认目标机和主机的 IP 地址正确。
-
-
段错误定位
-
使用
catch signal SIGSEGV
捕获信号:复制(gdb) catch signal SIGSEGV (gdb) run
-
六、总结
-
核心流程:
gdbserver
启动监听 → 主机gdb
连接 → 加载程序 → 设置断点 → 运行调试。 -
关键命令:
break
,step
,next
,print
,backtrace
是调试的核心工具。 -
调试原则:
-
始终使用
-g
编译程序。 -
优先通过日志和断点缩小问题范围。
-
通过上述命令,可高效完成嵌入式 Linux 程序的远程调试。如需更复杂场景(如多进程、信号处理),可结合 GDB 脚本或 Python 扩展
。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937329.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!