72 votes

après la mise à jour, gdb ne s'attache pas au processus

Je viens de passer de la 10.04 à la 11.04 et gdb ne me permet plus d'attacher des processus. J'obtiens l'erreur suivante

Attachement au processus 10144 Impossible s'attacher au processus. Si votre uid correspond à l'uid du processus cible, vérifiez le paramètre de /proc/sys/kernel/yama/ptrace_scope, ou bien réessayez en tant qu'utilisateur root. Pour plus de détails, consultez /etc/sysctl.d/10-ptrace.conf ptrace : Opération non autorisée.

Comment puis-je corriger cela afin de pouvoir déboguer à nouveau sans sudo ?

117voto

Senseful Points 22513

Dans Maverick Meerkat (10.10) Ubuntu a introduit un correctif pour interdire le ptracing des processus non enfants par les utilisateurs non root - c'est-à-dire que seul un processus qui est parent d'un autre processus peut le ptracer pour les utilisateurs normaux - alors que root peut toujours ptracer chaque processus. C'est pourquoi vous pouvez toujours utiliser gdb pour attacher via sudo.

Vous pouvez temporairement désactiver cette restriction (et revenir à l'ancien comportement permettant à votre utilisateur de ptracer (gdb) n'importe lequel de ses autres processus) en faisant :

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Pour l'autoriser de façon permanente, modifiez /etc/sysctl.d/10-ptrace.conf et changer la ligne :

kernel.yama.ptrace_scope = 1

A lire :

kernel.yama.ptrace_scope = 0

Pour en savoir plus sur les raisons de ce changement, voir le site web de la Commission européenne. Wiki Ubuntu .

3voto

mpb Points 995

Si vous préférez laisser /proc/sys/kernel/yama/ptrace_scope fixé à sa valeur par défaut de 1 alors, comme solution de contournement, vous pouvez envisager d'utiliser l'option gdb pour exécuter le programme que vous voulez déboguer. Vous pouvez alors faire apparaître le débogueur en appuyant simplement sur ^C . Par exemple, pour déboguer vers le programme (ennuyeux) sleep 60 faites ce qui suit :

$ gdb -q sleep -ex 'run 60'

Voici un exemple complet.

$ gdb -q sleep -ex 'run 60'
Reading symbols from sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) backtrace
#0  0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1  0x0000000000403cd7 in ?? ()
#2  0x0000000000403b88 in ?? ()
#3  0x00000000004016c9 in ?? ()
#4  0x00007ffff7a35ec5 in __libc_start_main (main=0x401540, argc=2, argv=0x7fffffffea08, init=<optimized out>, 
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe9f8) at libc-start.c:287
#5  0x00000000004017d5 in ?? ()
(gdb) continue
Continuing.
[Inferior 1 (process 3531) exited normally]
(gdb) quit

Desde /bin/sleep a été (sans surprise) compilé sans informations de débogage, le backtrace ci-dessus contient des informations minimales.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X