Peut-on récupérer une application en cours d'exécution depuis un terminal?

26

Parfois, j'ai besoin d'exécuter une application à partir du terminal pour le débogage. Si je suis sûr que le bogue se produira peu de temps après le lancement de l'application, je peux exécuter cette application à partir du terminal.

Cependant, des bugs se produisent de manière inattendue, et alors seulement j'ai besoin de surveiller l'application buggy depuis le terminal (pour voir sa sortie).

Puis-je récupérer une application du terminal, qui n'a pas été lancée à l'aide du terminal? Si c'est le cas, comment?

Benjoin
la source
J'ai finalement pris la réponse de Michał Šrajer parce que c'était la plus instructive. Mais toutes vos réponses étaient bonnes et appréciées également. À votre santé.
Benjamin
Les messages d'erreur précédents (dans stderr) sont écrits ~/.xsession-errorssi vous l'avez lancé via l'interface graphique.
Lekensteyn

Réponses:

30

Chaque processus sous Linux a un répertoire spécial /proc/{pid}/fd/. 0 est stdin, 1 est stdout et 2 est stderr. Donc, en supposant que vous ne soyez intéressé que par la sortie de diagnostic, vous pouvez déterminer le pid du processus, puis dans le terminal:

pour voir stdout:

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

pour voir stderr:

cat /proc/{pid of process}/fd/2
Michał Šrajer
la source
OK, je suis un peu confus, lorsque je lance, cat /proc/1840/fd/1il semble renvoyer la sortie d'autres processus que celui que j'ai choisi. (1840 est actuellement pour Skype selon System Monitor) Il montre également la sortie d'autres programmes ...: |
Benjamin
9

Ou vous pouvez utiliser stracecomme ça

sudo strace -p $pid_of_the_process
organiser
la source
6

Vous pouvez joindre avec gdbà un processus en cours.

La syntaxe est

gdb program pid

Ok, vous ne pouvez pas voir le code source, si les informations de débogage sont supprimées, ce qui est la valeur par défaut pour les applications déployées. Mais vous pouvez probablement voir les messages stdout / stderr et debugger, segfaults.

enzotib
la source
J'ai essayé ça mais ça n'a pas marché. Par exemple, le Moniteur système montre que Cairo-Dock ID est 1452, donc je lance gdb program 1452(j'ai aussi essayé gdb 1452), mais il renvoie "1452: Aucun fichier ou répertoire de ce type".
Benjamin
Le premier devrait fonctionner. Qu'est-ce qu'il a rendu?
enzotib
Voici ce qu'il revient complètement après avoir demandé le 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
J'ai dit le premier, avec gdb program pid. Je pense que la sortie que vous avez montrée estgdb pid
enzotib
Désolé, mon erreur. `Le programme gdb 3385 (à nouveau Skype) renvoie ceci .
Benjamin
5

Vous recherchez probablement retty. Vous pouvez également rechercher "attach tty". Fondamentalement, cela se fait en utilisant ptraceafin que vous puissiez même rouler le vôtre.

nc3b
la source