Puis-je utiliser GDB pour déboguer un processus en cours d'exécution?

Sous linux, puis-je utiliser GDB pour déboguer un processus en cours d'exécution?

94
demandé sur Justin Ethier 2010-02-22 06:39:49

7 réponses

Oui. Utilisez la commande attach. Découvrez ce lien pour plus d'informations. Taper help attach sur une console GDB donne ce qui suit:

(gdb) help attach

Joindre à un processus ou un fichier en dehors de GDB. Cette commande s'attache à une autre cible, du même type que votre dernière Commande" target " ("info files " affichera votre pile cible). La commande peut prendre comme argument un ID de processus, un nom de processus (avec un ID de processus facultatif comme suffixe), ou un fichier de périphérique. Pour un ID de processus, vous devez avoir la permission d'envoyer un signal au processus, et il doit avoir le même uid que le débogueur. Lorsque vous utilisez "attach " dans un processus existant, le débogueur programme en cours d'exécution dans le processus, en regardant d'abord dans le travail en cours répertoire, ou (s'il n'y est pas trouvé) en utilisant le chemin de recherche du fichier source (voir la commande" directory"). Vous pouvez également utiliser la commande" file" pour spécifier le programme et charger sa table de symboles.


NOTE: Vous pouvez avoir difficulté à attacher à un processus en raison de amélioration de la sécurité dans le noyau Linux - par exemple attacher à l'enfant d'un shell à partir d'un autre.

Vous devrez probablement définir /proc/sys/kernel/yama/ptrace_scope en fonction de vos besoins. De nombreux systèmes sont maintenant par défaut à 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.
72
répondu Carl Norum 2017-10-13 10:05:15

Vous pouvez attacher à un processus en cours avec gdb -p PID.

93
répondu Nikolai Fetissov 2010-02-22 03:42:45

Oui. Vous pouvez faire:

gdb program_name program_pid

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

gdb program_name `pidof program_name`
22
répondu J. Polfer 2010-04-23 21:49:55

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

14
répondu David Kanarek 2010-02-22 03:42:24

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}
3
répondu t0mm13b 2013-01-31 03:23:53

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

ps -ld | grep foo
gdb -p PID
2
répondu Nino Pereira 2016-01-21 16:47:21

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

1
répondu Milan Kerslager 2016-10-13 15:18:51