【问题标题】:Redirect running process STDOUT/STDERR to SSH STDOUT using GDB使用 GDB 将正在运行的进程 STDOUT/STDERR 重定向到 SSH STDOUT
【发布时间】:2015-12-15 13:01:00
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: linux redirect gdb embedded stdout


    【解决方案1】:

    只要能从 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)
    $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 系统调用中的初始输出位置。

    【讨论】:

    • 非常感谢,它运行良好,它让我更好地理解它是如何工作的。您可能想在第一个 ls 中添加一个“-l”,它没有让我这样做。
    猜你喜欢
    • 2012-07-14
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多