Czy mogę używać GDB do debugowania działającego procesu?

110

Czy w systemie Linux mogę używać GDB do debugowania aktualnie uruchomionego procesu?

Justin Ethier
źródło

Odpowiedzi:

88

Tak. Użyj attachpolecenia. Sprawdź ten link, aby uzyskać więcej informacji. Wpisanie help attachna konsoli GDB daje następujące efekty:

(gdb) help attach

Dołącz do procesu lub pliku poza GDB. To polecenie dołącza się do innego celu, tego samego typu, co ostatnie targetpolecenie (" info files" pokaże twój docelowy stos). Polecenie może przyjąć jako argument identyfikator procesu, nazwę procesu (z opcjonalnym identyfikatorem procesu jako przyrostek) lub plik urządzenia. Aby uzyskać identyfikator procesu, musisz mieć uprawnienia do wysyłania sygnału do procesu i musi mieć ten sam efektywny identyfikator użytkownika, co debugger. Używając " attach" do istniejącego procesu, debugger znajduje program działający w procesie, szukając najpierw w bieżącym katalogu roboczym lub (jeśli nie został tam znaleziony) używając ścieżki wyszukiwania pliku źródłowego (zobacz polecenie " directory"). Możesz także użyć polecenia " file", aby określić program i załadować jego tablicę symboli.


UWAGA: Możesz mieć trudności z dołączeniem do procesu ze względu na ulepszone zabezpieczenia w jądrze Linuksa - na przykład dołączenie do elementu potomnego jednej powłoki z drugiej.

Prawdopodobnie będziesz musiał ustawić w /proc/sys/kernel/yama/ptrace_scopezależności od swoich wymagań. Wiele systemów ma teraz wartość domyślną 1lub wyższą.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.
Carl Norum
źródło
8
Link jest uszkodzony :( Z mojego punktu widzenia lubię odpowiedzi jak ta od J. Polfer . Pozdrawiam;)
olibre
Naprawiłem link.
Attie
czy to działa również dla pid procesu w zdalnym miejscu docelowym?
Bionix1441
Musisz wtedy uruchomić serwer debugowania w zdalnym miejscu docelowym; potem powinno być to samo.
Carl Norum
Flagę można zmienić za pomocą echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki
108

Możesz dołączyć do uruchomionego procesu za pomocą gdb -p PID.

Nikolai Fetissov
źródło
24

Tak. Możesz to zrobić:

gdb program_name program_pid

Skrót byłby taki (zakładając, że działa tylko jedna instancja):

gdb program_name `pidof program_name`
J. Polfer
źródło
Nie wiem, co to robi, ale na pewno nie działa na mnie. Mówi, że <program_pid> nie istnieje.
Sowa
2
Uważam, że działa to najlepiej, ponieważ oprócz dołączania do procesu ładuje tablicę symboli. Należy zauważyć, że program_namedziała, jeśli jesteś w tym samym katalogu, co plik binarny. Myślę, że ścieżka do pliku binarnego zadziała, jeśli jesteś w innym katalogu.
KarateSnowMachine
Nie zapomniałeś o -pprzed program_id? Konieczne może być również uruchomienie gdb z sudo, aby dołączyć do działającego procesu.
mxmlnkn
15

Polecenie, którego należy użyć, to gdb attach pidgdzie pid jest identyfikatorem procesu, do którego chcesz się podłączyć.

David Kanarek
źródło
3

Tak, możesz. Załóżmy, że proces foojest uruchomiony ...

ps -elf | grep foo

poszukaj numeru PID

gdb -a {numer PID}
t0mm13b
źródło
5
W jakiej dystrybucji używasz? Używając najnowszej wersji Fedory, 'gdb -a' wyświetla błąd „opcja -a jest niejednoznaczna”.
Justin Ethier,
1
oficjalnym argumentem jest -p / - pid
Mahmoud Al-Qudsi
3

Jeśli ktoś chce dołączyć proces, musi mieć tego samego właściciela. Root może dołączyć się do dowolnego procesu.

Milan Kerslager
źródło
2

ps -elf nie pokazuje PID. Zamiast tego polecam:

ps -ld | grep foo
gdb -p PID
Nino Pereira
źródło
2

Najłatwiej jest podać identyfikator procesu .

gdb -p `pidof your_running_program_name`

Pobierz pełną listę opcji w man gdbpoleceniu.

W przypadku, gdy istnieje wiele procesów dla tego samego programu, poniższe polecenie wyświetli listę procesów.

ps -C program -o pid h
<number>

Następnie identyfikator (numer) procesu wyjściowego może być użyty jako argument gdb.

gdb -p <process id>
shuva
źródło