Frage Beim Ausführen von gdb im Docker wird ein Haltepunkt erreicht, aber der Haltepunkt kann nicht eingegeben werden. Grund Um die Sicherheit des Hosts zu gewährleisten, hat Docker viele Sicherheitseinstellungen aktiviert, darunter ASLR (Address Space Layout Randomization), dh die Speicheradresse in Docker unterscheidet sich von der Speicheradresse des Hosts. ASLR führt dazu, dass adressabhängige Programme wie GDB nicht richtig funktionieren. Problemumgehung Verwenden Sie die Superprivilegien von Docker und fügen Sie --privileged hinzu (zwei Bindestriche, Markdown-Syntax wie: docker run --privilegiert …
GDB funktioniert normal Superberechtigungen deaktivieren viele Sicherheitseinstellungen, sodass Sie die Docker-Funktionen voll nutzen können Sie können beispielsweise Docker in Docker öffnen, haha. Zusatzwissen: Docker Ptrace: Vorgang nicht zulässig. Wie man damit umgeht Wenn gdb im Docker einen Prozess debuggt, wird ein Fehler gemeldet: (gdb) anhängen 30721 Anhängen an Prozess 30721 ptrace: Vorgang nicht zulässig.
Der Grund ist, dass ptrace in Docker standardmäßig deaktiviert ist. Unter Berücksichtigung der Anforderungen der Anwendungsanalyse gibt es mehrere Lösungen: 1. Seccomp ausschalten docker run --security-opt seccomp=unconfined
2. Verwenden Sie den Super-Berechtigungsmodus docker run --privilegiert
3. Öffnen Sie nur die Ptrace-Einschränkungen docker run --cap-add sys_ptrace
Wenn Sie gdb nur zum Debuggen verwenden möchten, wird aus Sicherheitsgründen natürlich die dritte Methode empfohlen. Der Secure Computing Mode (seccomp) ist eine Funktion des Linux-Kernels, mit der die innerhalb eines Containers verfügbaren Vorgänge eingeschränkt werden können. Das Standard-Seccomp-Profil für Docker ist eine Whitelist, die die zulässigen Anrufe angibt. In der folgenden Tabelle sind wichtige (aber nicht alle) Systemaufrufe aufgeführt, die effektiv blockiert sind, da sie nicht auf der Whitelist stehen. Diese Tabelle enthält den Grund, warum jeder Systemaufruf blockiert wurde. Systemaufruf | Beschreibung |
---|
Konto | Abrechnungssystemaufruf, der Containern ermöglichen könnte, ihre eigenen Ressourcenbeschränkungen oder Prozessabrechnungen zu deaktivieren. Wird auch durch CAP_SYS_PACCT gesteuert. | Schlüssel hinzufügen | Verhindern Sie, dass Container den Kernel-Schlüsselbund verwenden, der nicht in einen Namespace unterteilt ist. | Abonnieren | Ähnlich wie clock_settime und settimeofday sind Uhrzeit und Datum nicht in Namespaces unterteilt. Auch durch CAP_SYS_TIME gesteuert. | bpf | Verweigern Sie das Laden potenziell persistenter BPF-Programme in den Kernel, da dies bereits durch CAP_SYS_ADMIN gesteuert wird. | clock_adjtime | Zeit/Datum sind nicht in Namespaces unterteilt. Auch durch CAP_SYS_TIME gesteuert. | Uhr_Zeit einstellen | Zeit/Datum sind nicht in Namespaces unterteilt. Auch durch CAP_SYS_TIME gesteuert. | Klon | Das Klonen neuer Namespaces wird verweigert. Wird auch durch CAP_SYS_ADMIN für CLONE_*-Flags gesteuert, außer für CLONE_USERNS. | Modul erstellen | Verweigert Manipulationen und Funktionen an Kernelmodulen. Veraltet. Wird auch durch CAP_SYS_MODULE gesteuert. | module_löschen | Verweigert Manipulationen und Funktionen an Kernelmodulen. Wird auch durch CAP_SYS_MODULE gesteuert. | finit_module | Verweigert Manipulationen und Funktionen an Kernelmodulen. Wird auch durch CAP_SYS_MODULE gesteuert. | get_kernel_syms | Abrufen exportierter Kernel- und Modulsymbole verweigern. Veraltet. | get_mempolicy | Systemaufruf, der den Kernelspeicher und die NUMA-Einstellungen ändert. Bereits durch CAP_SYS_NICE gesteuert. | init_module | Verweigert Manipulationen und Funktionen an Kernelmodulen. Wird auch durch CAP_SYS_MODULE gesteuert. | ioperm | Verhindern Sie, dass Container die E/A-Berechtigungsstufen des Kernels ändern. Bereits durch CAP_SYS_RAWIO geschützt. | iopl | Verhindern Sie, dass Container die E/A-Berechtigungsstufen des Kernels ändern. Bereits durch CAP_SYS_RAWIO geschützt. | kcmp | Schränken Sie die Möglichkeiten zur Prozessprüfung ein, die bereits durch das Löschen von CAP_PTRACE blockiert sind. | kexec_datei_laden | Schwestersystemaufruf von kexec_load, der dasselbe tut, mit leicht anderen Argumenten. Ebenfalls durch CAP_SYS_BOOT gesteuert. | kexec_laden | Verweigert das Laden eines neuen Kernels zur späteren Ausführung. Wird auch durch CAP_SYS_BOOT gesteuert. | Schlüsselwert | Verhindern Sie, dass Container den Kernel-Schlüsselbund verwenden, der nicht in einen Namespace unterteilt ist. | lookup_dcookie | Ablaufverfolgungs-/Profiling-Systemaufruf, der viele Informationen über den Host preisgeben könnte. Wird auch durch CAP_SYS_ADMIN gesteuert. | mbind | Systemaufruf, der den Kernelspeicher und die NUMA-Einstellungen ändert. Bereits durch CAP_SYS_NICE gesteuert. | montieren | Mounten verweigern, bereits durch CAP_SYS_ADMIN gesperrt. | Seiten verschieben | Systemaufruf, der den Kernelspeicher und die NUMA-Einstellungen ändert. | Name der zu bearbeitenden Stelle | Schwestersystemaufruf zu open_by_handle_at. Bereits durch CAP_SYS_NICE gesteuert. | nfsservctl | Interaktion mit dem Kernel-NFS-Daemon verweigern. Veraltet seit Linux 3.1. | geöffnet per Handle bei | Ursache für einen Ausbruch aus einem alten Container. Auch gesteuert durch CAP_DAC_READ_SEARCH. | Leistungsereignis_öffnen | Ablaufverfolgungs-/Profiling-Systemaufruf, der zu einem Informationsverlust über den Host führen kann. | Persönlichkeit | Verhindern Sie, dass der Container die BSD-Emulation aktiviert. Nicht grundsätzlich gefährlich, aber schlecht getestet, Potenzial für viele Kernel-Schwachstellen. | Pivot-Wurzel | Pivot_root verweigern, sollte ein privilegierter Vorgang sein. | process_vm_readv | Schränken Sie die Möglichkeiten zur Prozessprüfung ein, die bereits durch das Löschen von CAP_PTRACE blockiert sind. | process_vm_writev | Schränken Sie die Möglichkeiten zur Prozessprüfung ein, die bereits durch das Löschen von CAP_PTRACE blockiert sind. | ptrace | Tracing-/Profiling-Systemaufruf, der viele Informationen über den Host preisgeben könnte. Wurde bereits durch Löschen von CAP_PTRACE blockiert. | Abfragemodul | Verweigert Manipulationen und Funktionen an Kernelmodulen. Veraltet. | Quotenaktl | Kontingent-Systemaufruf, der Containern ermöglichen könnte, ihre eigenen Ressourcenbeschränkungen oder Prozessabrechnungen zu deaktivieren. Wird ebenfalls durch CAP_SYS_ADMIN gesteuert. | Neustart | Lassen Sie nicht zu, dass Container den Host neu starten. Auch durch CAP_SYS_BOOT gesteuert. | Anforderungsschlüssel | Verhindern Sie, dass Container den Kernel-Schlüsselbund verwenden, der nicht in einen Namespace unterteilt ist. | Speicherrichtlinie festlegen | Systemaufruf, der den Kernelspeicher und die NUMA-Einstellungen ändert. Bereits durch CAP_SYS_NICE gesteuert. | sätze | Verweigert die Zuordnung eines Threads zu einem Namespace. Wird auch durch CAP_SYS_ADMIN gesteuert. | Tageszeit festlegen | Zeit/Datum sind nicht in Namespaces unterteilt. Auch durch CAP_SYS_TIME gesteuert. | Socket, Socketaufruf | Wird zum Senden oder Empfangen von Paketen und für andere Socket-Operationen verwendet. Alle Socket- und Socketcall-Aufrufe sind blockiert, mit Ausnahme der Kommunikationsdomänen AF_UNIX, AF_INET, AF_INET6, AF_NETLINK und AF_PACKET. | Zeit | Zeit/Datum sind nicht in Namespaces unterteilt. Auch durch CAP_SYS_TIME gesteuert. | Tauschen | Start/Stopp des Swappings in Datei/Gerät verweigern. Wird auch durch CAP_SYS_ADMIN gesteuert. | Tausch | Start/Stopp des Swappings in Datei/Gerät verweigern. Wird auch durch CAP_SYS_ADMIN gesteuert. | sysfs | Veralteter Systemaufruf. | _sysctl | Veraltet, ersetzt durch /proc/sys. | umount | Sollte ein privilegierter Vorgang sein. Wird auch durch CAP_SYS_ADMIN gesteuert. | umount2 | Sollte ein privilegierter Vorgang sein. Wird auch durch CAP_SYS_ADMIN gesteuert. | Freigabe aufheben | Das Klonen neuer Namespaces für Prozesse wird verweigert. Wird auch durch CAP_SYS_ADMIN gesteuert, mit Ausnahme von unshare –user. | uselib | Älterer Systemaufruf im Zusammenhang mit gemeinsam genutzten Bibliotheken, lange Zeit nicht verwendet. | Benutzerfehlerfd | Fehlerbehandlung von Seiten im Userspace, hauptsächlich für die Prozessmigration erforderlich. | ustat | Veralteter Systemaufruf. | vm86 | Im Kernel x86 Realmodus virtuelle Maschine. Auch gesteuert durch CAP_SYS_ADMIN. | vm86old | Im Kernel x86 Realmodus virtuelle Maschine. Auch gesteuert durch CAP_SYS_ADMIN. |
Der obige Artikel zur Lösung des Problems, dass bei Verwendung von GDB in Docker keine Haltepunkte eingegeben werden können, ist der gesamte Inhalt, den der Editor mit Ihnen teilt. Ich hoffe, er kann Ihnen als Referenz dienen, und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen. Das könnte Sie auch interessieren:- Lösung für das Problem des unzureichenden Speicherressourcenpools des Docker-Servers
- Anweisungen zur Verwendung der Option --rm von Docker Run
- Detaillierte Erklärung der Lösung für das zu langsame Docker-Compose
|