Czy w systemie Linux mogę używać GDB do debugowania aktualnie uruchomionego procesu?
Czy w systemie Linux mogę używać GDB do debugowania aktualnie uruchomionego procesu?
Odpowiedzi:
Tak. Użyj attach
polecenia. Sprawdź ten link, aby uzyskać więcej informacji. Wpisanie help attach
na 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
target
polecenie ("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_scope
zależności od swoich wymagań. Wiele systemów ma teraz wartość domyślną 1
lub 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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
.
Możesz dołączyć do uruchomionego procesu za pomocą gdb -p PID
.
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`
program_name
dział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.
-p
przed program_id
? Konieczne może być również uruchomienie gdb z sudo, aby dołączyć do działającego procesu.
Polecenie, którego należy użyć, to gdb attach pid
gdzie pid jest identyfikatorem procesu, do którego chcesz się podłączyć.
Tak, możesz. Załóżmy, że proces foo
jest uruchomiony ...
ps -elf | grep foo poszukaj numeru PID gdb -a {numer PID}
Jeśli ktoś chce dołączyć proces, musi mieć tego samego właściciela. Root może dołączyć się do dowolnego procesu.
ps -elf nie pokazuje PID. Zamiast tego polecam:
ps -ld | grep foo
gdb -p PID
Najłatwiej jest podać identyfikator procesu .
gdb -p `pidof your_running_program_name`
Pobierz pełną listę opcji w man gdb
poleceniu.
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>