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

110

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

Justin Ethier
la source

Réponses:

88

Oui. Utilisez la attachcommande. Consultez ce lien pour plus d'informations. Taper help attachsur 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 targetcommande " info files" (" " affichera votre pile cible). La commande peut prendre comme argument un identifiant de processus, un nom de processus (avec un identifiant de processus facultatif comme suffixe) ou un fichier de périphérique. Pour un identifiant de processus, vous devez avoir l'autorisation d'envoyer un signal au processus et il doit avoir le même uid effectif que le débogueur. Lors de l'utilisation de " attach" dans un processus existant, le débogueur trouve le programme en cours d'exécution dans le processus, en regardant d'abord dans le répertoire de travail courant, ou (s'il n'y est pas trouvé) en utilisant le chemin de recherche du fichier source (voir la directorycommande " "). Vous pouvez également utiliser la filecommande " " pour spécifier le programme et charger sa table de symboles.


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

Vous devrez probablement définir en /proc/sys/kernel/yama/ptrace_scopefonction de vos besoins. De nombreux systèmes sont désormais par défaut 1ou supérieurs.

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.
Carl Norum
la source
8
Le lien est rompu: (De mon point de vue, j'aime les réponses comme celle-ci de J. Polfer . Cheers;)
olibre
J'ai corrigé le lien.
Attie
cela fonctionne-t-il aussi pour un pid d'un processus sur une cible distante?
Bionix1441
Vous devez alors exécuter un serveur de débogage sur la cible distante; après cela, il devrait en être de même.
Carl Norum
Le drapeau peut être changé en utilisant echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki
108

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

Nikolai Fetissov
la source
24

Oui. Tu peux 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`
J. Polfer
la source
Je ne sais pas ce que ça fait mais ça ne marche pas pour moi. Il dit que <program_pid> n'existe pas.
Owl
2
Je trouve que cela fonctionne mieux car il charge la table des symboles en plus de l'attacher au processus. Il convient de noter que cela program_namefonctionne si vous êtes dans le même répertoire que le binaire. Je pense qu'un chemin vers le binaire fonctionnerait si vous êtes dans un répertoire différent.
KarateSnowMachine
N'avez-vous pas oublié le -pdevant program_id? En outre, il peut être nécessaire d'exécuter gdb avec sudo pour l'attacher à un processus en cours d'exécution.
mxmlnkn
15

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

David Kanarek
la source
3

Oui, vous pouvez. Supposons un processusfoo est en cours d'exécution ...

ps -elf | grep foo

recherchez le numéro PID

gdb -a {numéro PID}
t0mm13b
la source
5
Sur quelle distribution utilisez-vous? En utilisant une version récente de Fedora, 'gdb -a' affiche une erreur "option -a est ambiguë".
Justin Ethier
1
l'argument officiel est -p / - pid
Mahmoud Al-Qudsi
3

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.

Milan Kerslager
la source
2

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

ps -ld | grep foo
gdb -p PID
Nino Pereira
la source
2

Le moyen le plus simple est de fournir l' identifiant du processus .

gdb -p `pidof your_running_program_name`

Veuillez obtenir la liste complète des options dans man gdb commande.

Si plusieurs processus sont en cours d'exécution pour le même programme, la commande suivante répertorie les processus.

ps -C program -o pid h
<number>

Ensuite, l' identifiant du processus de sortie (numéro) peut être utilisé comme argument de gdb.

gdb -p <process id>
Shuva
la source