Home gdb远程调试
Post
Cancel

gdb远程调试

有时程序的开发机器和运行的目标机器不是同一台设备,需要在目标机器环境调试,即需要远程调试。 一个简单的方式是使用telnet或ssh等工具登录到目标机器,再使用gdb进行本地调试即可。如果没有这样的条件,也可以使用gdbserver工具进行远程调试。

gdbserver

GDBserver是一个独立于GDB的调试服务器工具,它允许GDB通过网络连接到运行在远程目标系统上的调试目标。 GDBserver的主要作用是在远程目标系统上提供调试服务,它与GDB之间通过网络通信,实现对目标系统的调试和控制。

一些关于GDBserver的主要特点:

  1. 远程调试:GDBserver允许在一个计算机上运行GDB,通过网络连接到另一个计算机上运行的目标系统,并对目标系统进行调试。这对于嵌入式系统和远程设备的调试非常有用。

  2. 平台无关:它可以与不同的目标系统和处理器架构进行通信,如x86、ARM、MIPS等。

  3. 轻量级:GDBserver是一个相对轻量级的工具,可以运行在资源有限的嵌入式系统上。

  4. 多种通信方式: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

This post is licensed under CC BY 4.0 by the author.

关于终端尺不适配的问题

init进程--systemd