如何在GDB/GDBServer远程调试环境中重定向TTY
解决远程GDBServer IO重定向到主机另一终端的问题
我懂你遇到的痛点——当用SSH管道把本地GDB和远程GDBServer连起来时,常规的tty /dev/pts/10完全不管用,因为目标程序的IO链路被SSH管道和GDBServer封装住了,本地GDB的tty命令没法穿透到远程的目标程序上。下面给你两种亲测有效的解决方案:
方案一:启动GDBServer时直接指定IO重定向
适合提前规划好终端的场景,步骤如下:
- 在主机目标终端建立反向映射
打开你想用来接收目标程序输入输出的终端(比如你提到的/dev/pts/10),执行这条SSH命令,把主机终端映射到远程目标机的临时文件:
ssh -R /tmp/remote_target_io:/dev/pts/10 user@192.168.222.111
这条命令会在目标机/tmp目录下生成remote_target_io文件,它相当于主机终端的“镜像”——远程程序读写这个文件,就直接对应到主机的目标终端。
- 启动GDB并指定GDBServer的IO路径
在你的GDB终端,把原连接命令修改为:
target remote | ssh -T user@192.168.222.111 gdbserver - --stdin=/tmp/remote_target_io --stdout=/tmp/remote_target_io --stderr=/tmp/remote_target_io app_to_debug arg1 arg2 arg3
这里的--stdin/--stdout/--stderr是GDBServer的官方参数,专门用来指定目标程序的IO路径。
方案二:连接后动态修改IO路径
如果已经启动了GDB和GDBServer的连接,不想重启,可以用这种动态调整方法:
- 先建立主机到目标机的终端映射
同样在主机目标终端执行反向转发命令:
ssh -R /tmp/remote_target_io:/dev/pts/10 user@192.168.222.111
(如果遇到权限问题,可在目标机执行chmod 666 /tmp/remote_target_io,确保GDBServer有权限读写)
- 在GDB中设置远程目标程序的TTY
回到GDB终端,执行这条命令:
set remote inferior-tty /tmp/remote_target_io
然后重启目标程序(执行run命令),新启动的进程就会把IO输出到你指定的主机终端了。
额外注意事项
- 如果直接转发终端出现乱码、光标异常等问题,可用
socat创建伪终端中转,稳定性更好:
主机终端执行:
目标机执行:socat PTY,link=/tmp/local_pty,raw,echo=0 TCP-LISTEN:12345
之后把GDBServer的IO路径改为socat TCP:192.168.222.1:12345 PTY,link=/tmp/target_pty,raw,echo=0/tmp/target_pty即可。 - 保持执行反向转发的终端处于活跃状态,关闭终端会导致映射失效。
内容的提问来源于stack exchange,提问作者feddischson
相关产品推荐
相关产品推荐

