有时程序的开发机器和运行的目标机器不是同一台设备,需要在目标机器环境调试,即需要远程调试。 一个简单的方式是使用telnet或ssh等工具登录到目标机器,再使用gdb进行本地调试即可。如果没有这样的条件,也可以使用gdbserver工具进行远程调试。
gdbserver
GDBserver是一个独立于GDB的调试服务器工具,它允许GDB通过网络连接到运行在远程目标系统上的调试目标。 GDBserver的主要作用是在远程目标系统上提供调试服务,它与GDB之间通过网络通信,实现对目标系统的调试和控制。
一些关于GDBserver的主要特点:
远程调试:GDBserver允许在一个计算机上运行GDB,通过网络连接到另一个计算机上运行的目标系统,并对目标系统进行调试。这对于嵌入式系统和远程设备的调试非常有用。
平台无关:它可以与不同的目标系统和处理器架构进行通信,如x86、ARM、MIPS等。
轻量级:GDBserver是一个相对轻量级的工具,可以运行在资源有限的嵌入式系统上。
多种通信方式:GDBserver支持多种通信方式,包括TCP/IP网络连接和串行端口连接。可以根据实际情况选择适合的通信方式进行远程调试。
大致结构
1
2
3
4
5
6
7
8
9
10
11
+----------------+ +----------------+
| GDB Client | | GDB Server |
+----------------+ +----------------+
| | | |
| +----------+ | | +------------+ |
| | GDB | | | | GDBserver | |
| | Local | | Network/Serial | | Remote | |
| | Machine |-+-------------------+-| Machine | |
| +----------+ | | +------------+ |
| | | |
+----------------+ +----------------+
有两个主要的组件:GDB Client和GDB Server。 GDB Client就是运行在本地机器上的GDB调试器。即gdb
工具,它除了可以直接调试本地的程序,其实还可以作为客户端,连接到其他的gdbserver,去调试远端的程序。默认就是调试本地的。 GDB Server是运行在远程机器上的调试服务器。即gdbserver
工具,它接收来自GDB Client的调试命令,并在远程机器上执行相应的操作,如设置断点、读写内存、获取寄存器值等。 GDB Client与GDB Server之间通过网络或串行端口建立连接。GDB Client发送调试命令和请求给GDB Server,然后GDB Server在远程机器上执行相应的操作,并将结果返回给GDB Client进行显示和分析。
基本使用
可以先在目标机上先启动gdbserver,再在本地机器上使用gdb连接。
server (target) side
usage
1
2
3
4
# 新建模式
gdbserver <comm> <program>
# 附着模式
gdbserver --attach <comm> <pid>
示例:
1
2
3
4
5
# 在所有网络地址上侦听9999端口
$ gdbserver :9999 ./test
# 在串口上等待连接
$ gdbserver /dev/ttyS1 ./testapp
ok,结束。
client (host) side
usage
1
2
3
4
5
6
7
8
# 先使用gdb调试相同的程序,可以从本地快速读取符号
gdb ./testapp
# 然后连接远端目标
## 从网络连接
(gdb) target remote <ip>:<port>
## 如从串口
(gdb) target remote /dev/ttyUSB*
之后可以对远端目标进行调试了,调试命令基本相同。
参考
man gdbserver