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?


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

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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.