web-dev-qa-db-fra.com

après la mise à niveau, gdb ne sera pas attaché au processus

Je viens tout juste de passer de 10.04 à 11.04 et gdb ne me permet plus de m'attacher aux processus, mais l'erreur se produit.

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

Comment puis-je résoudre ce problème afin que je puisse déboguer à nouveau sans sudo?

66
Andrew Redd

Dans Maverick Meerkat (10.10), Ubuntu a introduit un correctif pour interdire le traçage de processus non enfants par des utilisateurs non root - c'est-à-dire. seul un processus parent d'un autre processus peut le rechercher pour des utilisateurs normaux, tandis que root peut toujours récupérer chaque processus. C'est pourquoi vous pouvez toujours utiliser gdb pour attacher via Sudo.

Vous pouvez désactiver temporairement cette restriction (et revenir à l'ancien comportement permettant à votre utilisateur de ptrace (gdb) l'un de leurs autres processus) en procédant comme suit:

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

Pour lui permettre de manière permanente éditer /etc/sysctl.d/10-ptrace.conf et changer la ligne:

kernel.yama.ptrace_scope = 1

Lire

kernel.yama.ptrace_scope = 0

Pour en savoir plus sur les raisons de cette modification, voir le wiki Ubunt

105
alexmurray

Si vous préférez laisser /proc/sys/kernel/yama/ptrace_scope défini sur sa valeur par défaut, 1, vous pouvez envisager, comme solution de contournement, d’utiliser gdb pour exécuter le programme que vous souhaitez déboguer. Vous pouvez ensuite faire apparaître le débogueur en appuyant simplement sur ^C. Par exemple, pour déboguer vers le programme (ennuyeux) sleep 60, procédez comme 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

Puisque /bin/sleep a été compilé (sans surprise) sans informations de débogage, la trace ci-dessus contient un minimum d'informations.

3
mpb