it-swarm.com.de

Wie lösen Sie "ptrace-Vorgang nicht zulässig", wenn Sie versuchen, GDB an einen Prozess anzuhängen?

ich versuche, ein Programm mit gdb anzuhängen, aber es bringt mich zurück:

Anhängen an Prozess 29139 Verbindung zum Prozess konnte nicht hergestellt werden. Wenn Ihre Benutzer-ID mit der Benutzer-ID des Ziels übereinstimmt Überprüfen Sie die Einstellung von/proc/sys/kernel/yama/ptrace_scope, oder versuchen Sie es mit wieder als root-Benutzer. Weitere Informationen finden Sie unter /etc/sysctl.d/10-ptrace.conf ptrace: Vorgang nicht erlaubt.

edb-debugger meldet "Verbindung zum Prozess konnte nicht hergestellt werden. Bitte überprüfen Sie die Berechtigungen und versuchen Sie es erneut."

strace gibt "attach: ptrace (PTRACE_ATTACH, ...): Operation nicht zulässig" zurück

ich änderte "kernel.yama.ptrace_scope" 1 auf 0 und "/ proc/sys/kernel/yama/ptrace_scope" 1 auf 0 und versuchte "setze LD_PRELOAD = ./ptrace.so" mit:

#include <stdio.h>
int ptrace(int i, int j, int k, int l)
{
    printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l);
    return 0;
}

aber es gibt immer noch den gleichen Fehler zurück. Wie kann ich es an Debugger anschließen?

35
user2850750

Wenn Sie Docker verwenden, benötigen Sie wahrscheinlich folgende Optionen:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
73
wisbucky

Dies liegt an der Kernel-Härtung in Linux. Sie können dieses Verhalten deaktivieren, indem Sie echo 0 > /proc/sys/kernel/yama/ptrace_scope verwenden oder es in /etc/sysctl.d/10-ptrace.conf ändern.

Siehe auch diesen Artikel dazu in Fedora 22 (mit Links zur Dokumentation) und diesen Kommentarthread zu Ubuntu und.

29
jesup

Ich habe den obigen Anwendungsfall nicht wirklich angesprochen, aber ich hatte dieses Problem:

Problem : Es kam vor, dass ich mein Programm mit Sudo gestartet habe, also beim Starten von gdb ptrace: Operation not permitted

Lösung : Sudo gdb ...

7
Maxim Chetrusca

Ich möchte hinzufügen, dass ich --security-opt apparmor=unconfined zusammen mit den von @wisbucky genannten Optionen brauchte. Dies war auf Ubuntu 18.04 (sowohl Docker-Client als auch Host). Der vollständige Aufruf zum Aktivieren des gdb-Debuggens in einem Container lautet daher wie folgt:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined

4
Juraj Oršulić

Vielleicht hat jemand diesen Prozess mit gdb angehängt.

  • ps -ef | grep gdb

gdb kann den gleichen Prozess nicht zweimal anhängen.

2
Raymond

Jesups Antwort ist richtig; Es liegt an der Verhärtung des Linux-Kernels. In meinem Fall verwende ich Docker Community für Mac. Um das Flag zu ändern, muss ich die LinuxKit-Shell mit justin cormacks nsenter (ref: https://www.bretfisher.com/docker-for eingeben -mac-befehle-um-in-local-docker-vm-zu-gelangen / ).

docker run -it --rm --privileged --pid=Host justincormack/nsenter1

/ # cat/etc/issue

Willkommen bei LinuxKit

                    ##         .
              ## ## ##        ==
           ## ## ## ## ##    ===
       /"""""""""""""""""\___/ ===
      {                       /  ===-
       \______ O           __/
         \    \         __/
          \____\_______/

/ # cat/proc/sys/kernel/yama/ptrace_scope

1

/ # echo 0>/proc/sys/kernel/yama/ptrace_scope

/ # Ausfahrt

1
YudhiWidyatama

Ich weiß nicht, was Sie mit LD_PRELOAD oder Ihrer ptrace-Funktion machen.

Warum versuchst du nicht, gdb an ein sehr einfaches Programm anzuhängen? Erstellen Sie ein Programm, das einfach wiederholt Hello oder etwas druckt, und verwenden Sie gdb --pid [hallo program PID], um es anzufügen.

Wenn das nicht funktioniert, haben Sie wirklich ein Problem.

Ein weiteres Problem ist die Benutzer-ID. Ist das Programm, das Sie verfolgen, auf eine andere UID eingestellt? Wenn dies der Fall ist, können Sie es nicht finden, es sei denn, Sie verwenden dieselbe Benutzer-ID oder sind root.

0
Zan Lynx

Ich bin mit dem gleichen Problem konfrontiert und versuche eine Menge Lösung, aber schließlich habe ich die Lösung gefunden, aber ich weiß nicht, was das Problem war. Zuerst habe ich den ptrace_conf-Wert geändert und mich als Root in Ubuntu angemeldet, aber das Problem wird immer noch angezeigt. Das Seltsamste, was passiert ist, ist, dass die GDB mir eine Nachricht zeigte, die besagt: 

Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user.
For more details, see /etc/sysctl.d/10-ptrace.conf warning: process 3767 is already traced by process 3755 ptrace: Operation not permitted.

Mit dem Befehlsterminal ps wurde der Prozess 3755 nicht aufgelistet. 

Ich habe den Prozess 3755 in/proc/$ pid gefunden, aber ich verstehe nicht, was es war !!

Schließlich löschte ich die Zieldatei (foo.c), die ich versuche, es mit dem PTRACE_ATTACH-Programm syscall an das Programm vid gdb und tracer anzuhängen, und in dem anderen Ordner habe ich ein anderes Programm c erstellt und kompiliert. 

das Problem wurde behoben und ich konnte einen anderen Prozess entweder über gdb oder ptrace_attach syscall anhängen. 

(gdb) attach 4416

Attaching to process 4416

und ich schicke viele Signale an den Prozess 4416. Ich habe es mit gdb und ptrace getestet, beide laufen korrekt. 

ich weiß nicht, was das Problem war, aber ich denke, es ist kein Fehler in Ubuntu, da viele Websites darauf verwiesen haben, wie zB https://askubuntu.com/questions/143561/why-wont- strace-gdb-Attach-to-a-process-even-obwohl-im-root

0