可以从终端取一个正在运行的应用程序吗?


26

有时我需要从终端运行应用程序进行调试。如果我确定该错误将在启动应用程序后不久发生,则可以从终端运行该应用程序。

但是,错误会意外发生,然后只有我需要从终端监视有问题的应用程序(以查看其输出)。

然后可以从终端中提取未使用终端启动的应用程序吗?如果可以,怎么办?


我最终选择了MichałŠrajer的答案,因为这是最有启发性的。但是您所有的答案都很好,也很感激。干杯。
本杰明

~/.xsession-errors如果您是通过GUI启动的,则先前的错误消息(发送给stderr)将被写入。
Lekensteyn 2011年

Answers:


30

linux中的每个进程都有一个特殊的目录/proc/{pid}/fd/。0是标准输入,1是标准输出,2是标准错误。因此,假设您只对诊断输出感兴趣,则可以确定进程pid,然后在终端中执行以下操作:

看stdout:

cat /proc/{pid of process}/fd/1

看stderr:

cat /proc/{pid of process}/fd/2

好吧,我有点困惑,当我运行cat /proc/1840/fd/1它时,它似乎返回的不是我选择的其他进程的输出。(根据系统监视器,Skype当前为1840)也显示了其他程序的输出...:|
本杰明


6

您可以附加gdb到正在运行的进程。

语法是

gdb program pid

好的,如果除去了调试信息,则看不到源代码,这是已部署应用程序的默认设置。但是您可能会看到stdout / stderr和调试器消息,segfaults。


我试过了,但是没用。例如,系统监视器显示Cairo-Dock ID为1452,因此我运行gdb program 1452(我也尝试过gdb 1452),但它返回“ 1452:无此类文件或目录。”
Benjamin

第一个应该工作。它返回了什么?
enzotib 2011年

这是在索取pid 1840(Skype)之后完全返回的内容:GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... 1840: No such file or directory.
Benjamin

我说的是第一个gdb program pid。我认为您显示的输出来自gdb pid
enzotib 2011年

抱歉,是我的错。gdb程序3385(再次是Skype)返回this
本杰明

5

您可能正在寻找retty。您也可以寻找“ attach tty”。基本上是使用来完成的,ptrace因此您甚至可以自己滚动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.