È possibile prelevare un'applicazione in esecuzione dal terminale?


26

A volte ho bisogno di eseguire un'applicazione dal terminale per il debug. Se sono sicuro che il bug si verificherà poco dopo l'avvio dell'applicazione, posso eseguire questa applicazione dal Terminale.

Tuttavia, i bug si verificano in modo imprevisto e quindi solo io ho bisogno di monitorare l'applicazione buggy dal Terminale (per vedere il suo output).

Posso quindi prelevare un'applicazione dal terminale, che non è stato avviato utilizzando il Terminale? Se é cosi, come?


Alla fine ho raccolto la risposta di Michał Šrajer perché era la più istruttiva. Ma tutte le tue risposte sono state buone e apprezzate. Saluti.
Benjamin,

I messaggi di errore precedenti (su stderr) vengono scritti ~/.xsession-errorsse è stato avviato tramite la GUI.
Lekensteyn,

Risposte:


30

Ogni processo in Linux ha una directory speciale /proc/{pid}/fd/. 0 è stdin, 1 è stdout e 2 è stderr. Quindi, supponendo che tu sia interessato solo all'output diagnostico, puoi determinare il pid del processo, e quindi nel terminale fare:

per vedere stdout:

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

per vedere stderr:

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

OK, sono un po 'confuso, quando eseguo cat /proc/1840/fd/1sembra restituire output da processi diversi da quello che ho raccolto. (1840 è attualmente per Skype secondo System Monitor) Mostra anche l'output di altri programmi ...: |
Benjamin,


6

È possibile collegarsi gdba un processo in esecuzione.

La sintassi è

gdb program pid

Ok, non puoi vedere il codice sorgente, se le informazioni di debug vengono rimosse, che è l'impostazione predefinita per le applicazioni distribuite. Ma probabilmente puoi vedere messaggi stdout / stderr e debugger, segfaults.


Ci ho provato ma non ha funzionato. Ad esempio, System Monitor mostra che Cairo-Dock ID è 1452, quindi corro gdb program 1452(ho anche provato gdb 1452), ma restituisce "1452: nessun file o directory."
Benjamin

Il primo dovrebbe funzionare. Cosa è tornato?
enzotib,

Questo è ciò che ritorna completamente dopo aver chiesto 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

Ho detto il primo, quello con gdb program pid. Penso che l'output che hai mostrato gdb pid
provenga

Scusa, errore mio. `Il programma gdb 3385 (di nuovo Skype) restituisce questo .
Benjamin,

5

Probabilmente stai cercando retty. Puoi anche cercare "attach tty". Fondamentalmente è fatto usando in ptracemodo da poter anche rotolare il tuo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.