第二章 用户态程序gdb调试
前言
用户态程序在运行过程中可能会出现异常的工作状态,此时通过特定的方式可以定位程序出错的原因,该方式的其中一种就是可以使用gdb调试。
一、嵌入式设备调试-gdbserver
嵌入式设备因其资源短缺问题,基本不会将调试相关的环境放置在系统中,从而没法直接在设备上运行gdb等调试工具,这时就需要gdbserver等服务器软件在系统中部署,从而将客户端放在可以调试的环境机器中,远程对嵌入式设备进行调试。
1.准备事项
- 调试程序需要添加调试参数,如C语言程序需要添加-g参数,从而使调试程序中有需要的符号表
- 在目标机上安装gdbserver服务端软件,同时目标机中有网络或者串口
- 在调试机中安装gdb软件,同时调试机可以通过串口或者网络访问到目标机
- 调试机中放有被调试程序需要的所有的运行环境库
2.gdbserver通信方式
- 串口通信(COMM):使用一个tty设备和其他机器通信,如(/dev/ttyUSB0)
- 网口通信(HOST:PORT):使用TCP协议和其他机器通信,端口号自定义,如(127.0.0.1:1234),以下内容都以网口通信为例
3.常用gdbserver参数说明
- –help
打印gdbserver的使用方式和参数说明
- –attach
通常情况下,gdbserver启动时要指定要调试的程序执行命令,从而运行程序调试。当有这个参数时,就不需要指定执行命令,可以调试正在运行的程序,最后需要加运行程序的PID,如调试进程号为1111的进程
gdbserver --attath 127.0.0.1:1234 1111
- –multi
通常情况下,gdbserver启动时都要指定具体的要调试的程序。当有这个参数时,可以不指定调试程序,在gdb连接时再指定
目标机:
gdbserver --multi 127.0.0.1:1234
调试机: (gdb) target extended-remote 127.0.0.1:1234 # 连接目标机,不能使用remote,因为remote会查找执行程序 (gdb) set remote exec-file a.out # 指定要执行的程序/bin/pwd (gdb) file a.out # 加载a.out的符号表 (gdb) r # 执行调试程序
- –once
通常情况下,在客户端断开一个连接会话后,gdbserver也不会退出,继续等待下一个连接。当有这个参数,第一个会话断开连接后gdbserver就会退出
gdbserver --attath --once 127.0.0.1:1234 1111
- –version
显示gdbserver的版本信息
3.使用说明
- 目标机启动gdbserver
gdbserver 127.0.0.1:1234 ./.a.out
- 调试机启动gdb(调试机gdb为交叉编译的gdb,后面所有相同)
gdb
- 调试机连接目标机
(gdb) target remote 127.0.0.1:1234
- 查看符号表
(gdb) info sharedlibrary # 如果有缺失的动态库则需要添加
- 添加动态库,此处添加的动态库是调试机中的路径
solib-search-path设置的是被搜索文件的路径,可以有多个 (gdb) set solib-search-path . #如果当前gcc所运行的路径下存在动态库,则添加,当前路径下的子目录不查找 solib-absolute-prefix设置的是被搜索文件路径的前缀,只能有一个 (gdb) set solib-absolute-prefix /root/abc #如果/root/abc下存在需要的动态库,则添加,包含/root/abc下的子目录中的动态库
- 通过gdb命令进行调试
4.总结
gdbserver对gdb进行了扩充,解决了gdb只能本机调试的弊端,实现了CS模式下的gdb调试,具体的调试方式还是和gdb相同。
|