使用 GDB 将 运行 进程 STDOUT/STDERR 重定向到 SSH STDOUT

Redirect running process STDOUT/STDERR to SSH STDOUT using GDB

我在嵌入式系统 (linux) 上有一个进程 运行。 它的 STDOUT/STDERR 是串行端口上的控制台。

我想将其输出(标准和错误)重定向到 SSH 会话的输出。 我读过你可以用 GDB 做类似的操作,但我不知道你将如何重定向到 SSH 会话的 STDOUT/STDERR 而不是文件。

由于磁盘资源不足,我无法对文件执行此操作。我也看过一些使用命名管道的示例,但我没有可用的 mkfifo 命令。我有GDB。

此外,假设这是可能的,当我关闭 SSH 会话时进程会终止吗?如果是这样,我可以先重定向回来吗?

谢谢。

只要能从gdb调用libc函数就可以。

#ssh root@embedded

查询守护进程输出位置:

# ls -l /proc/`pidof daemon`/fd/1
/proc/13202/fd/1 -> /dev/null

它可以不为空,它可以指向某个其他控制台甚至某个管道或文件,将此位置存储在某处。查询你的ssh会话输出位置:

# ls /proc/self/fd/1 -l
lrwx------ 1 root root 64 дек.  15 16:51 /proc/self/fd/1 -> /dev/pts/9

或者如果有的话直接打电话给 tty

现在开始工作:

# gdb -p `pidof daemon`
..
81      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) call open("/dev/pts/9",2,0)
 = 0x3
(gdb) call dup2(3,2)
 = 0x2
(gdb) call dup2(3,1)
 = 0x1
(gdb) quit
Detaching from program: /root/daemon, process 13202
 daemon output/errorput

在退出 ssh 会话之前重复相同的步骤,只需将 /dev/pts/9 替换为 open 系统调用中的初始输出位置。