![可以从终端选择正在运行的应用程序吗?](https://linux22.com/image/1093297/%E5%8F%AF%E4%BB%A5%E4%BB%8E%E7%BB%88%E7%AB%AF%E9%80%89%E6%8B%A9%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%90%97%EF%BC%9F.png)
有时我需要从终端运行应用程序进行调试。如果我确定错误会在启动应用程序后不久发生,我可以从终端运行此应用程序。
然而,错误总是出乎意料地发生,这时我只需要从终端监视有缺陷的应用程序(查看其输出)。
那么我可以从终端中选择一个未使用终端启动的应用程序吗?如果可以,该怎么做?
答案1
Linux 中的每个进程都有一个特殊目录/proc/{pid}/fd/
。0 是 stdin,1 是 stdout,2 是 stderr。因此,假设您只对诊断输出感兴趣,您可以确定进程 pid,然后在终端中执行以下操作:
查看标准输出:
cat /proc/{pid of process}/fd/1
查看 stderr:
cat /proc/{pid of process}/fd/2
答案2
或者你可以使用strace
像这样
sudo strace -p $pid_of_the_process
答案3
您可以附加gdb
到正在运行的进程。
语法是
gdb program pid
好的,如果删除了调试信息(这是已部署应用程序的默认设置),您将无法看到源代码。但您可能可以看到 stdout/stderr 和调试器消息、段错误。
答案4
您可能正在寻找retty
。您也可以查找“attach tty”。基本上它已经完成了,ptrace
因此您甚至可以自己动手。