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?


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

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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.