Posso usare GDB per eseguire il debug di un processo in esecuzione?


110

Sotto Linux, posso usare GDB per eseguire il debug di un processo attualmente in esecuzione?

Risposte:


88

Sì. Usa il attachcomando. Dai un'occhiata a questo link per maggiori informazioni. Digitando help attachsu una console GDB si ottiene quanto segue:

(gdb) help attach

Allega a un processo o file al di fuori di GDB. Questo comando si attacca a un altro bersaglio, dello stesso tipo dell'ultimo " target" comando (" info files" mostrerà la pila del bersaglio). Il comando può prendere come argomento un ID di processo, un nome di processo (con un ID di processo opzionale come suffisso) o un file di dispositivo. Per un ID processo, è necessario disporre dell'autorizzazione per inviare un segnale al processo e deve avere lo stesso uid effettivo del debugger. Quando si utilizza " attach" un processo esistente, il debugger trova il programma in esecuzione nel processo, cercando prima nella directory di lavoro corrente o (se non trovato lì) utilizzando il percorso di ricerca del file di origine (vedere il directorycomando " "). È inoltre possibile utilizzare il filecomando " " per specificare il programma e caricare la sua tabella dei simboli.


NOTA: potresti avere difficoltà a collegarti a un processo a causa della maggiore sicurezza nel kernel Linux , ad esempio collegandoti al figlio di una shell da un'altra.

Probabilmente dovrai impostare in /proc/sys/kernel/yama/ptrace_scopebase alle tue esigenze. Molti sistemi ora impostano per impostazione predefinita 1o superiore.

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
Il collegamento è interrotto :( Dal mio punto di vista, mi piacciono le risposte come questa di J. Polfer . Cheers;)
olibre

Ho corretto il collegamento.
Attie

funziona anche per un pid di un processo su un obiettivo remoto?
Bionix1441

Quindi devi eseguire un server di debug sulla destinazione remota; dopodiché dovrebbe essere lo stesso.
Carl Norum

La bandiera può essere modificata utilizzando echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki


24

Sì. Tu puoi fare:

gdb program_name program_pid

Una scorciatoia sarebbe (supponendo che sia in esecuzione una sola istanza):

gdb program_name `pidof program_name`

Non so cosa faccia, ma di sicuro non funziona per me. Dice che <program_pid> non esiste.
Gufo

2
Trovo che funzioni meglio in quanto carica la tabella dei simboli oltre a collegarsi al processo. Va notato che program_namefunziona se ci si trova nella stessa directory del binario. Penso che un percorso per il binario funzionerebbe se ti trovi in ​​una directory diversa.
KarateSnowMachine

Non hai dimenticato il -pdavanti program_id? Inoltre, potrebbe essere necessario eseguire gdb con sudo per collegarsi a un processo in esecuzione.
mxmlnkn

15

Il comando da utilizzare è gdb attach piddove pid è l'id del processo a cui ci si vuole collegare.


3

Si, puoi. Assumi un processofoo sia in esecuzione ...

ps -elf | grep foo

cerca il numero PID

gdb -a {numero PID}

5
Su quale distribuzione stai eseguendo? Usando una versione recente di Fedora, "gdb -a" visualizza un errore "opzione -a è ambigua".
Justin Ethier,

1
l'argomento ufficiale è -p / - pid
Mahmoud Al-Qudsi

3

Se si desidera allegare un processo, questo processo deve avere lo stesso proprietario. La radice è in grado di connettersi a qualsiasi processo.


2

ps -elf non sembra mostrare il PID. Consiglio di usare invece:

ps -ld | grep foo
gdb -p PID

2

Il modo più semplice è fornire l' ID del processo .

gdb -p `pidof your_running_program_name`

Si prega di ottenere l'elenco completo delle opzioni in man gdbcomando.

Nel caso in cui siano in esecuzione più processi per lo stesso programma, il comando seguente elencherà i processi.

ps -C program -o pid h
<number>

Quindi l' ID del processo di output (numero) può essere utilizzato come argomento di gdb.

gdb -p <process id>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.