2010-02-22 9 views

risposta

62

Sì. Utilizzare il comando attach. Controlla this link per ulteriori informazioni. Digitando help attach ad una console GDB ha pronunciato la seguente:

(gdb) help attach 

connettersi a un processo o di un file al di fuori del GDB. Questo comando si collega a un'altra destinazione, dello stesso tipo dell'ultimo comando "target" ("info files" mostrerà lo stack di destinazione). Il comando può assumere come argomento un id di processo, un nome di processo (con un id di processo facoltativo come suffisso) o un file di dispositivo. Per un id di processo, è necessario disporre dell'autorizzazione per inviare al processo un segnale, e deve avere lo stesso uid effettivo del debugger. Quando si utilizza "attach" per un processo esistente, il debugger trova il programma in esecuzione nel processo, guardando prima nella corrente di lavoro directory, o (se non trovato lì) utilizzando il percorso di ricerca file sorgente (vedi "directory "comando). È inoltre possibile utilizzare il comando "" file per specificare il programma e caricare la relativa tabella dei simboli.


NOTA: Si può avere difficoltà a collegare a un processo a causa di improved security in the Linux kernel - ad esempio il fissaggio al figlio di una conchiglia da un altro.

È probabile che sia necessario impostare /proc/sys/kernel/yama/ptrace_scope in base alle proprie esigenze. Molti sistemi ora sono impostati su 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. 
+8

Il collegamento è interrotto :(Dal mio punto di vista, mi piacciono le risposte come [questo] (http://stackoverflow.com/a/2702170/938111) da [J. Polfer] (http: // stackoverflow .com/users/40411/j-polfer). Cheers;) – olibre

+0

Ho risolto il link. – Attie

+0

funziona anche per un pid di un processo su un target remoto? – Bionix1441

12

Il comando da utilizzare è gdb attach pid dove PID è l'ID di processo del processo che si desidera allegare al.

81

È possibile collegare a un processo in esecuzione con gdb -p PID.

2

Sì, è possibile. Si supponga un processo è in esecuzione foo ...

 
ps -elf | grep foo 

look for the PID number 

gdb -a {PID number} 
+5

In quale distribuzione stai lavorando? Usando una versione recente di Fedora, 'gdb -a' stampa un errore "opzione -a è ambigua". –

+1

l'argomento ufficiale è -p/- pid –

21

Sì. Si può fare:

gdb program_name program_pid 

Una scorciatoia sarebbe (assumendo una sola istanza è in esecuzione):

gdb program_name `pidof program_name` 
+0

Non so cosa faccia, ma sicuramente non funziona per me. Dice che non esiste. – Owl

+2

Trovo che questo funzioni meglio poiché carica la tabella dei simboli oltre a collegarsi al processo. Va notato che 'nome_programma 'funziona se ci si trova nella stessa directory del file binario. Penso che un percorso per il binario funzionerebbe se ci si trova in una directory diversa. – KarateSnowMachine

2

ps -elf non sembra mostrare il PID. Mi consiglia di utilizzare invece:

ps -ld | grep foo 
gdb -p PID 
1

Se si desidera collegare un processo, questo processo deve avere lo stesso proprietario. La root è in grado di collegarsi a qualsiasi processo.

Problemi correlati