124 votes

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 ?

124voto

Nikolai N Fetissov Points 52093

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

94voto

Carl Norum Points 114072

Oui. Utilisez le attach commande. Vérifier ce lien pour plus d'informations. Dactylographie help attach dans une console GDB donne ce qui suit :

(gdb) help attach

Attachement à un processus ou à un fichier en dehors de GDB. Cette commande permet de s'attacher à une autre cible, du même type que la dernière. " target commande " (" 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 optionnel comme suffixe), ou un fichier de périphérique. Pour un identifiant de processus, vous devez avoir la permission d'envoyer un signal au processus, et il doit avoir le même uid effectif que le débogueur. Lorsque vous utilisez " attach "à un processus existant, le débogueur trouve le programme qui s'exécute dans le processus. s'exécute dans le processus, en regardant d'abord dans le répertoire de travail actuel. ou (s'il ne s'y trouve pas) en utilisant le chemin de recherche du fichier source (voir l'option " directory "). Vous pouvez également utiliser la commande " file La commande " " permet de spécifier pour spécifier le programme et charger sa table de symboles.


REMARQUE : Il se peut que vous ayez des difficultés à vous attacher à un processus en raison des éléments suivants Amélioration de la sécurité du noyau Linux - par exemple, s'attacher à l'enfant d'un coquillage à partir d'un autre.

Vous devrez probablement définir /proc/sys/kernel/yama/ptrace_scope en fonction de vos besoins. De nombreux systèmes utilisent désormais par défaut 1 ou plus.

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 votes

Le lien est cassé :( De mon point de vue, j'aime les réponses comme celui-ci de J. Polfer . Santé ;)

0 votes

J'ai corrigé le lien.

0 votes

Cela fonctionne-t-il également pour le pid d'un processus sur une cible distante ?

26voto

J. Polfer Points 5895

Oui, vous pouvez le faire :

gdb program_name program_pid

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

gdb program_name `pidof program_name`

0 votes

Je ne sais pas ce que cela fait, mais c'est sûr que cela ne marche pas pour moi. Il dit que <program_pid> n'existe pas.

2 votes

Je trouve que cette méthode est la plus efficace, car elle charge la table des symboles en plus de l'attachement au processus. Il convient de 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 êtes dans un autre répertoire.

1 votes

N'avez-vous pas oublié le -p devant program_id ? De plus, il peut être nécessaire de lancer gdb avec sudo pour s'attacher à un processus en cours d'exécution.

15voto

David Kanarek Points 8816

La commande à utiliser est gdb attach pid où pid est l'identifiant du processus auquel vous voulez vous attacher.

4voto

t0mm13b Points 21031

Oui, c'est possible. Supposons un processus foo est en cours...

ps -elf | grep foo

look for the PID number

gdb -a {PID number}

5 votes

Quelle est la distribution sur laquelle vous travaillez ? Avec une version récente de Fedora, 'gdb -a' affiche une erreur "option -a is ambiguous".

1 votes

L'argument officiel est -p/--pid

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X