Kann man eine laufende Anwendung vom Terminal abholen?

26

Manchmal muss ich zum Debuggen eine Anwendung vom Terminal ausführen. Wenn ich sicher bin, dass der Fehler kurz nach dem Starten der Anwendung auftritt, kann ich diese Anwendung über das Terminal ausführen.

Es treten jedoch unerwartet Fehler auf, und nur dann muss ich die fehlerhafte Anwendung vom Terminal aus überwachen (um die Ausgabe zu sehen).

Kann ich dann eine Anwendung vom Terminal abholen, die nicht mit Terminal gestartet wurde? Wenn das so ist, wie?

Benjamin
quelle
Schließlich habe ich Michał Šrajers Antwort aufgegriffen, weil sie am aufschlussreichsten war. Aber alle Ihre Antworten waren einfach gut und wurden auch geschätzt. Prost.
Benjamin
In frühere Fehlermeldungen (an stderr) wird geschrieben, ~/.xsession-errorswenn Sie sie über die GUI gestartet haben.
Lekensteyn

Antworten:

30

Jeder Prozess unter Linux hat ein spezielles Verzeichnis /proc/{pid}/fd/. 0 ist stdin, 1 ist stdout und 2 ist stderr. Unter der Annahme, dass Sie nur an Diagnoseausgaben interessiert sind, können Sie die Prozess-PID ermitteln und dann im Terminal Folgendes ausführen:

um stdout zu sehen:

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

um stderr zu sehen:

cat /proc/{pid of process}/fd/2
Michał Šrajer
quelle
OK, ich bin ein bisschen verwirrt, wenn ich cat /proc/1840/fd/1es starte, scheint es die Ausgabe von anderen Prozessen als dem zurückzugeben, den ich aufgenommen habe. (1840 ist derzeit für Skype laut System Monitor) Zeigt auch die Ausgabe anderer Programme an ...: |
Benjamin
9

Oder Sie verwenden können , stracewie diese

sudo strace -p $pid_of_the_process
ordnen
quelle
6

Sie können an gdbeinen laufenden Prozess anhängen .

Die Syntax lautet

gdb program pid

Ok, Sie können den Quellcode nicht sehen, wenn die Debug-Informationen entfernt wurden. Dies ist die Standardeinstellung für bereitgestellte Anwendungen. Aber Sie können wahrscheinlich stdout / stderr- und Debugger-Meldungen sehen, Segfaults.

Enzotib
quelle
Ich habe es versucht, aber es hat nicht funktioniert. Beispielsweise zeigt der Systemmonitor an, dass die Kairo-Dock-ID 1452 lautet. Ich habe es also ausgeführt gdb program 1452(ich habe es auch versucht gdb 1452), aber es wird "1452: Keine solche Datei oder kein solches Verzeichnis" zurückgegeben.
Benjamin
Der erste sollte funktionieren. Was ist zurückgekehrt?
Enzotib
Dies ist, was es vollständig zurückgibt, nachdem nach PID 1840 (Skype) gefragt wurde: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
Ich sagte das erste, das mit gdb program pid. Ich denke, die Ausgabe, die Sie gezeigt haben, ist vongdb pid
enzotib
Entschuldigung, mein Fehler. `gdb Programm 3385 (wieder Skype) gibt dies zurück .
Benjamin
5

Sie suchen wahrscheinlich nach retty. Sie könnten auch nach "attach tty" suchen. Grundsätzlich ist es mit getan, ptraceso dass Sie sogar Ihre eigenen rollen könnten.

nc3b
quelle