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


67

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?

Réponses:


107

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, consultez le wiki Ubuntu.


4
Merci. J'ai ajouté le temporaire à une commande dans mon fichier bin utilisateur afin de pouvoir l'activer et le désactiver fonctionne très bien.
Andrew Redd

Je modifie un /etc/sysctl.d/10-ptrace.conffichier. cela fonctionne parfaitement pour moi. :)
Soroosh

8
Si vous avez modifié des fichiers dans /etc/sysctl.d, vous pouvez les appliquer automatiquement avec "sudo service procps restart"
frankster le

@alexmurray - Votre réponse utile devrait également indiquer qu'un redémarrage est nécessaire pour que les modifications /etc/sysctl.dprennent effet. Pour moi, un redémarrage du système était suffisant, mais peut-être excessif - voir le commentaire de frankster ci-dessus. Après le redémarrage, la valeur de /etc/sysctl.dest copiée dans /proc/sys/kernel/yama/ptrace_scope. (En outre, dans mon cas, je ne pouvais pas éditer directement ptrace_scope, même avec sudo.)
Andy Thomas

Aucun redémarrage n'est nécessaire. Il suffit de lancer: sysctl -ppour appliquer les modifications de /etc/sysctl.confet /etc/sysctl.d/*. Pour ce changement spécifique, dans Ubuntu 15.04 Vivid, le fichier est/etc/sysctl.d/10-ptrace.conf
Mircea Vutcovici

3

Si vous préférez laisser la /proc/sys/kernel/yama/ptrace_scopevaleur par défaut définie sur 1, vous pouvez utiliser une solution de contournement gdbpour exécuter le programme que vous souhaitez déboguer. Vous pouvez ensuite afficher le débogueur en appuyant simplement sur ^C. Par exemple, pour déboguer 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

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


2
Vous n'avez pas attaché , vous l'avez commencé . C'est assez différent, car dans ce cas, il gdbest le parent direct du débogueur et a tous les droits de le déboguer, même avec ptrace_scope==1. Cela ne marcherait pas si vous étiez attaché , c'est-à-dire que vous sleep 60& gdb -ex "attach $!"
faisiez

L'exemple (compteur?) Proposé par Ruslan, sleep 60& gdb -ex "attach $!"n'est pas "utiliser gdb pour exécuter le programme", et n'est donc pas une réfutation de mon travail. L'exemple de Ruslan utilise le shell pour s'exécuter en premier sleep, puis s'exécuter gdb. Ma solution de contournement fonctionne , et c'est ce qui m'importe. Je ne sais pas et je ne m'inquiète pas vraiment de savoir si nous gdbattachons réellement ou non son enfant. Je tiens à pouvoir déboguer l'enfant. Ma solution de contournement accomplit cela. Néanmoins, j'ai reformulé ma réponse pour plus de clarté.
MPB
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.