Можно ли забрать запущенное приложение из терминала?

26

Иногда мне нужно запустить приложение из терминала для отладки. Если я уверен, что ошибка возникнет вскоре после запуска приложения, я могу запустить это приложение из Терминала.

Однако ошибки возникают неожиданно, и тогда только мне нужно следить за ошибочным приложением из Терминала (чтобы увидеть его вывод).

Могу ли я забрать приложение из терминала, которое не было запущено с помощью терминала? Если так, то как?

Вениамин
источник
В конце концов я взял ответ Михала Шрайера, потому что он был самым поучительным. Но все ваши ответы были просто хорошими и ценными. Приветствия.
Бенджамин
Предыдущие сообщения об ошибках (в stderr) записываются, ~/.xsession-errorsесли вы запустили его через графический интерфейс.
Лекенштейн

Ответы:

30

Каждый процесс в Linux имеет специальный каталог /proc/{pid}/fd/. 0 - стандартный, 1 - стандартный, 2 - стандартный. Итак, предполагая, что вас интересует только диагностический вывод, вы можете определить pid процесса, а затем в терминале выполнить:

чтобы увидеть стандартный вывод:

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

чтобы увидеть stderr:

cat /proc/{pid of process}/fd/2
Михал Шрайер
источник
Хорошо, я немного запутался, когда я запускаю, cat /proc/1840/fd/1кажется, что он возвращает результаты других процессов, чем тот, который я выбрал. (1840 в настоящее время для Skype по данным системного монитора) Он также показывает результаты других программ ...: |
Бенджамин
9

Или вы можете использовать straceкак это

sudo strace -p $pid_of_the_process
организовать
источник
6

Вы можете присоединиться gdbк запущенному процессу.

Синтаксис

gdb program pid

Хорошо, вы не можете увидеть исходный код, если отладочная информация удалена, что по умолчанию для развернутых приложений. Но вы, вероятно, можете увидеть сообщения stdout / stderr и отладчика, segfaults.

enzotib
источник
Я попробовал это, но это не сработало. Например, системный монитор показывает, что идентификатор Cairo-Dock равен 1452, поэтому я запускаю gdb program 1452(я тоже пробовал gdb 1452), но он возвращает «1452: нет такого файла или каталога».
Бенджамин
Первый должен работать. Что это вернуло?
энзотиб
Это то, что он возвращает полностью после запроса 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.
Бенджамин
Я сказал первый, что с gdb program pid. Я думаю, что вывод, который вы показали, отgdb pid
enzotib
Извините моя ошибка. `GDB программа 3385 (снова Skype) возвращает это .
Бенджамин
5

Вы, вероятно, ищете retty. Вы также можете искать «прикрепить tty». В основном это сделано с помощью, ptraceчтобы вы могли даже свернуть свой собственный.

nc3b
источник