Czy można odebrać działającą aplikację z terminala?

26

Czasami muszę uruchomić aplikację z terminala w celu debugowania. Jeśli jestem pewien, że błąd wystąpi wkrótce po uruchomieniu aplikacji, mogę uruchomić tę aplikację z poziomu terminalu.

Błędy pojawiają się jednak nieoczekiwanie, a potem tylko muszę monitorować błędną aplikację z terminala (aby zobaczyć jej dane wyjściowe).

Czy mogę wtedy odebrać aplikację z terminala, która nie została uruchomiona za pomocą terminala? Jeśli tak to jak?

Benzoes
źródło
W końcu podniosłem odpowiedź Michała Šrajera, ponieważ była ona najbardziej pouczająca. Ale wszystkie twoje odpowiedzi były po prostu dobre i docenione. Twoje zdrowie.
Benjamin
Poprzednie komunikaty o błędach (do stderr) są zapisywane, ~/.xsession-errorsjeśli zostały uruchomione za pośrednictwem GUI.
Lekensteyn,

Odpowiedzi:

30

Każdy proces w systemie Linux ma specjalny katalog /proc/{pid}/fd/. 0 oznacza standardowe, 1 oznacza standardowe, a 2 standardowe. Zakładając, że interesuje Cię tylko wyjście diagnostyczne, możesz określić proces pid, a następnie w terminalu wykonaj:

aby zobaczyć standardowe wyjście:

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

zobaczyć stderr:

cat /proc/{pid of process}/fd/2
Michał Šrajer
źródło
OK, jestem trochę zdezorientowany, kiedy uruchamiam cat /proc/1840/fd/1, wydaje się, że zwraca dane wyjściowe z innych procesów niż ten, który pobrałem. (1840 jest obecnie dla Skype według Monitora systemu) Pokazuje także wyjście innych programów ...: |
Benjamin
9

Lub możesz użyć w straceten sposób

sudo strace -p $pid_of_the_process
zorganizować
źródło
6

Możesz dołączyć gdbdo z uruchomionym procesem.

Składnia jest następująca

gdb program pid

Ok, nie widzisz kodu źródłowego, jeśli informacje debugowania są usuwane, co jest domyślnym ustawieniem dla wdrożonych aplikacji. Ale prawdopodobnie możesz zobaczyć stdout / stderr i komunikaty debuggera, awarie.

enzotib
źródło
Próbowałem tego, ale to nie zadziałało. Na przykład Monitor systemu pokazuje, że Cairo-Dock ID to 1452, więc uruchamiam gdb program 1452(próbowałem też gdb 1452), ale zwraca „1452: Brak takiego pliku lub katalogu”
Benjamin
Pierwszy powinien działać. Co to wróciło?
enzotib
Oto, co w pełni zwraca po zapytaniu 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
Powiedziałem pierwszy, że z gdb program pid. gdb pid
Wydaje
Przepraszam, mój błąd. `Program gdb 3385 (ponownie Skype) zwraca to .
Benjamin
5

Prawdopodobnie szukasz retty. Możesz także poszukać „załącz tty”. Zasadniczo odbywa się to za pomocą, ptracewięc możesz nawet rzucić własne.

nc3b
źródło