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


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.

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


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`

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ć.


3

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

ps -elf | grep foo

poszukaj numeru PID

gdb -a {numer PID}

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.



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>
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.