2010-02-22 6 views

Répondre

62

Oui. Utilisez la commande attach. Consultez this link pour plus d'informations. Taper help attach sur une console GDB donne les éléments suivants:

(gdb) help attach 

attacher à un processus ou à l'extérieur de fichier GDB. Cette commande attache à une autre cible, du même type que votre dernière commande « target » (« info files » montrera votre pile cible). La commande peut prendre comme argument un identificateur de processus, un nom de processus (avec un identificateur de processus optionnel comme suffixe) ou un fichier de périphérique. Pour un ID de processus, vous devez avoir la permission d'envoyer le processus un signal, et il doit avoir le même uid que le débogueur. Lorsque vous utilisez « attach » à un processus existant, le débogueur trouve le fonctionnement du programme dans le processus, à la recherche d'abord dans le répertoire courant de travail , ou (s'il ne trouve pas) en utilisant le chemin de recherche de fichier source (voir le "directory "commande". Vous pouvez également utiliser la commande "file" pour spécifier le programme et charger sa table de symboles.


REMARQUE: Vous pouvez avoir des difficultés à attacher à un processus en raison de improved security in the Linux kernel - par exemple attacher à l'enfant d'une coquille d'une autre.

Vous aurez probablement besoin de mettre /proc/sys/kernel/yama/ptrace_scope en fonction de vos besoins. De nombreux systèmes par défaut maintenant 1 ou supérieur.

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

Le lien est cassé :(De mon point de vue, j'aime les réponses que [celui-ci] (http://stackoverflow.com/a/2702170/938111) de [J. Polfer] (http: // stackoverflow .com/users/40411/j-polfer). Bravo;) – olibre

+0

J'ai corrigé le lien. – Attie

+0

cela fonctionne aussi pour un pid d'un processus sur une cible distante? – Bionix1441

12

La commande à utiliser est gdb attach pid où pid est l'ID de processus du processus que vous souhaitez attacher.

81

Vous pouvez attacher à un processus en cours d'exécution avec gdb -p PID.

2

Oui, vous pouvez. Supposons qu'un processus foo est en cours d'exécution ...

 
ps -elf | grep foo 

look for the PID number 

gdb -a {PID number} 
+5

Quelle distribution utilisez-vous? En utilisant une version récente de Fedora, 'gdb -a' affiche une erreur "option -a est ambiguë". –

+1

l'argument officiel est -p/- pid –

21

Oui. Vous pouvez faire:

gdb program_name program_pid 

Un raccourci serait (en supposant qu'une seule instance est en cours d'exécution):

gdb program_name `pidof program_name` 
+0

Je ne sais pas ce que ça fait mais c'est sûr que ça ne marche pas pour moi. Il dit que n'existe pas. – Owl

+2

Je trouve que cela fonctionne mieux car il charge la table des symboles en plus de se joindre au processus. Il est à noter que 'program_name' fonctionne si vous êtes dans le même répertoire que le binaire. Je pense qu'un chemin vers le binaire fonctionnerait si vous étiez dans un répertoire différent. – KarateSnowMachine

2

ps -elf ne semble pas montrer le PID. Je recommande d'utiliser à la place:

ps -ld | grep foo 
gdb -p PID 
1

Si l'on veut attacher un processus, ce processus doit avoir le même propriétaire. La racine est capable de s'attacher à n'importe quel processus.

Questions connexes