Sotto Linux, posso usare GDB per eseguire il debug di un processo attualmente in esecuzione?
Sotto Linux, posso usare GDB per eseguire il debug di un processo attualmente in esecuzione?
Risposte:
Sì. Usa il attach
comando. Dai un'occhiata a questo link per maggiori informazioni. Digitando help attach
su 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 ildirectory
comando " "). È inoltre possibile utilizzare ilfile
comando " " 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_scope
base alle tue esigenze. Molti sistemi ora impostano per impostazione predefinita 1
o 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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
.
Puoi collegarti a un processo in esecuzione con gdb -p PID
.
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`
program_name
funziona se ci si trova nella stessa directory del binario. Penso che un percorso per il binario funzionerebbe se ti trovi in una directory diversa.
-p
davanti program_id
? Inoltre, potrebbe essere necessario eseguire gdb con sudo per collegarsi a un processo in esecuzione.
Il comando da utilizzare è gdb attach pid
dove pid è l'id del processo a cui ci si vuole collegare.
Si, puoi. Assumi un processofoo
sia in esecuzione ...
ps -elf | grep foo cerca il numero PID gdb -a {numero PID}
Se si desidera allegare un processo, questo processo deve avere lo stesso proprietario. La radice è in grado di connettersi a qualsiasi processo.
ps -elf non sembra mostrare il PID. Consiglio di usare invece:
ps -ld | grep foo
gdb -p PID
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 gdb
comando.
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>