Pode-se pegar um aplicativo em execução no terminal?

26

Em algum momento eu preciso executar um aplicativo do terminal para depuração. Se tenho certeza de que o bug ocorrerá rapidamente após o lançamento do aplicativo, posso executá-lo no Terminal.

No entanto, os erros ocorrem inesperadamente, e somente eu preciso monitorar o aplicativo com bugs do Terminal (para ver sua saída).

Posso então pegar um aplicativo no terminal, que não foi iniciado usando o Terminal? Se sim, como?

Benjamin
fonte
Por fim, atendi à resposta de Michał Šrajer porque era a mais instrutiva. Mas todas as suas respostas foram boas e apreciadas também. Felicidades.
Benjamin
As mensagens de erro anteriores (para stderr) são gravadas ~/.xsession-errorsse você a ativou via GUI.
Lekensteyn 02/09

Respostas:

30

Cada processo no linux possui um diretório especial /proc/{pid}/fd/. 0 é stdin, 1 é stdout e 2 é stderr. Portanto, supondo que você esteja interessado apenas na saída de diagnóstico, você pode determinar o processo pid e, em seguida, no terminal:

para ver stdout:

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

para ver stderr:

cat /proc/{pid of process}/fd/2
Michał Šrajer
fonte
OK, estou um pouco confuso, quando corro cat /proc/1840/fd/1parece retornar a saída de outros processos que não o que eu peguei. (Atualmente, o 1840 é para o Skype, de acordo com o System Monitor). Também mostra a saída de outros programas ...: |
Benjamin
9

Ou você pode usar straceassim

sudo strace -p $pid_of_the_process
organizar
fonte
6

Você pode se conectar gdba um processo em execução.

A sintaxe é

gdb program pid

Ok, você não pode ver o código-fonte, se as informações de depuração forem removidas, que é o padrão para aplicativos implantados. Mas você provavelmente pode ver as mensagens stdout / stderr e depurador, segfaults.

enzotib
fonte
Eu tentei isso, mas não funcionou. Por exemplo, o System Monitor mostra que o ID do Cairo-Dock é 1452, então eu corro gdb program 1452(também tentei gdb 1452), mas ele retorna "1452: Não existe esse arquivo ou diretório".
Benjamin
O primeiro deve funcionar. O que retornou?
enzotib 4/09/11
Isto é o que ele retorna totalmente depois de solicitar o 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
Eu disse o primeiro, que com gdb program pid. Eu acho que a saída que você mostra é degdb pid
enzotib
Desculpe meu erro. `O programa gdb 3385 (novamente Skype) retorna isso .
Benjamin
5

Você provavelmente está procurando retty. Você também pode procurar por "anexar tty". Basicamente, é feito usando-o ptracepara que você possa rodar o seu próprio.

nc3b
fonte