it-swarm.com.de

Nach dem Upgrade wird GDB nicht an den Prozess anhängen

Ich habe vor kurzem ein Upgrade von 10.04 auf 11.04 durchgeführt und GDB erlaubt mir nicht mehr, Prozesse anzuhängen. Ich bekomme den Fehler nicht mehr

An Prozess anhängen 10144 An Prozess konnte keine Verbindung hergestellt werden. Wenn Ihre UID mit der UID des Zielprozesses übereinstimmt, überprüfen Sie die Einstellung von/proc/sys/kernel/yama/ptrace_scope, oder versuchen Sie es als Root-Benutzer erneut. Weitere Informationen finden Sie unter /etc/sysctl.d/10-ptrace.conf ptrace: Operation nicht zulässig.

Wie behebe ich das, damit ich ohne sudo wieder debuggen kann?

66
Andrew Redd

In Maverick Meerkat (10.10) führte Ubuntu einen Patch ein, um das Ptracen von nicht untergeordneten Prozessen durch Nicht-Root-Benutzer zu verhindern - d. H. Nur ein Prozess, der einem anderen Prozess übergeordnet ist, kann ihn für normale Benutzer verfolgen - während root weiterhin jeden Prozess verfolgen kann. Daher kann man mit gdb via Sudo noch anhängen.

Sie können diese Einschränkung vorübergehend deaktivieren (und zum alten Verhalten zurückkehren, sodass Ihr Benutzer jeden seiner anderen Prozesse verfolgen kann (gdb)), indem Sie folgende Schritte ausführen:

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

Um dies dauerhaft zuzulassen, bearbeiten Sie die Datei /etc/sysctl.d/10-ptrace.conf und ändern Sie die Zeile:

kernel.yama.ptrace_scope = 1

Lesen

kernel.yama.ptrace_scope = 0

Hintergrundinformationen dazu, warum diese Änderung vorgenommen wurde, finden Sie im buntu-Wiki

105
alexmurray

Wenn Sie es vorziehen, /proc/sys/kernel/yama/ptrace_scope auf den Standardwert von 1 zu setzen, können Sie das zu debuggende Programm zur Problemumgehung mit gdb ausführen. Sie können den Debugger dann einfach durch Drücken von ^C aufrufen. Gehen Sie beispielsweise folgendermaßen vor, um das (langweilige) Programm sleep 60 zu debuggen:

$ gdb -q sleep -ex 'run 60'

Hier ist ein vollständiges Beispiel.

$ 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

Da /bin/sleep (nicht überraschend) ohne Debugging-Informationen kompiliert wurde, enthält die obige Rückverfolgung nur minimale Informationen.

3
mpb