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

时间:2015-12-15 13:01:01

标签: linux redirect gdb embedded stdout

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

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

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

另外,假设这是可能的,当我关闭SSH会话时,进程会终止吗?如果是这样,我可以在我做之前重新定向吗?

感谢。

1 个答案:

答案 0 :(得分:2)

只要可以从gdb调用libc函数,就可以执行此操作。

#ssh root@embedded

查询守护程序输出位置:

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

它可以不为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)
$1 = 0x3
(gdb) call dup2(3,2)
$2 = 0x2
(gdb) call dup2(3,1)
$3 = 0x1
(gdb) quit
Detaching from program: /root/daemon, process 13202
 daemon output/errorput

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

相关问题