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

67

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?

Andrew Redd
quelle

Antworten:

106

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 noch via sudo 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), 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 Ubuntu-Wiki

Alex Murray
quelle
4
Vielen Dank. Ich habe die temporäre Datei zu einem Befehl in meiner Benutzer-Bin-Datei hinzugefügt, damit ich sie ein- und ausschalten kann.
Andrew Redd
Ich bearbeite die /etc/sysctl.d/10-ptrace.confDatei. es funktioniert perfekt für mich. :)
Soroosh
8
Wenn Sie einige Änderungen an Dateien in /etc/sysctl.d vorgenommen haben, können Sie diese automatisch mit "sudo service procps restart"
anwenden
@alexmurray - Ihre hilfreiche Antwort sollte auch beachten, dass ein Neustart erforderlich ist, damit die Änderungen /etc/sysctl.dwirksam werden. Für mich war ein Neustart des Systems ausreichend, aber möglicherweise übertrieben - siehe Franksters Kommentar oben. Nach dem Neustart wird der Wert von /etc/sysctl.din kopiert /proc/sys/kernel/yama/ptrace_scope. (In meinem Fall konnte ich ptrace_scope auch mit sudo nicht direkt bearbeiten.)
Andy Thomas
Es ist kein Neustart erforderlich. Einfach ausführen: sysctl -pÄnderungen von /etc/sysctl.confund übernehmen /etc/sysctl.d/*. Für diese spezielle Änderung in Ubuntu 15.04 Vivid ist die Datei/etc/sysctl.d/10-ptrace.conf
Mircea Vutcovici
3

Wenn Sie /proc/sys/kernel/yama/ptrace_scopeden Standardwert von 1beibehalten gdbmöchten, können Sie das zu debuggende Programm möglicherweise mit ausführen. Sie können den Debugger dann einfach durch Drücken von aufrufen ^C. Gehen Sie beispielsweise folgendermaßen vor, um das (langweilige) Programm zu debuggen sleep 60:

$ 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) kompiliert wurde, ohne Informationen zu debuggen, enthält der obige Backtrace nur minimale Informationen.

mpb
quelle
2
Du hast nicht angehängt , du hast angefangen . Es ist ganz anders, da es in diesem Fall gdbdirektes Elternteil des Debuggers ist und jedes Recht hat, es auch mit zu debuggen ptrace_scope==1. Es würde nicht funktionieren, wenn Sie stattdessen angefügt , dh etwas wiesleep 60& gdb -ex "attach $!"
Ruslan
Ruslans vorgeschlagenes (Gegen-?) Beispiel sleep 60& gdb -ex "attach $!"lautet nicht "Verwenden von gdb zum Ausführen des Programms" und ist daher keine Widerlegung meiner Abhilfemaßnahme. In Ruslans Beispiel wird die Shell verwendet, um zuerst sleepund dann auszuführen gdb. Meine Problemumgehung funktioniert , was mir wichtig ist. Ich weiß nicht, und es interessiert mich auch nicht wirklich, ob ich mich gdbtatsächlich an sein Kind binde oder nicht . Es ist mir wichtig, das Kind zu debuggen. Meine Problemumgehung erreicht das. Trotzdem habe ich meine Antwort aus Gründen der Klarheit umformuliert.
mpb