Lösen Sie das Problem, dass bei Verwendung von GDB in Docker keine Haltepunkte eingegeben werden können

Lösen Sie das Problem, dass bei Verwendung von GDB in Docker keine Haltepunkte eingegeben werden können

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

<<:  Analyse des Benchmarking-Prozesses von Sysbench für MySQL

>>:  Der Unterschied zwischen HTML-Iframe und Frameset_PowerNode Java Academy

Artikel empfehlen

Grundlegende Konzepte und allgemeine Methoden des Map-Mappings in ECMAScript6

Inhaltsverzeichnis Was ist eine Zuordnung? Unters...

Sequentielles und zufälliges Schreiben auf Linux-Festplatten

1. Einleitung ● Zufälliges Schreiben führt dazu, ...

Analyse und Lösung des beim Start von MySQL gemeldeten Fehlers „ERROR:2002“

Vorwort Dieser Artikel stellt hauptsächlich die A...

jQuery implementiert gleitende Registerkarte

In diesem Artikelbeispiel wird der spezifische Co...

Ein praktischer Bericht über einen durch den MySQL-Start verursachten Unfall

Inhaltsverzeichnis Hintergrund So ermitteln Sie, ...

Eine kurze Erläuterung der Unterschiede zwischen FTP, FTPS und SFTP

Inhaltsverzeichnis Einführung in FTP, FTPS und SF...

Einführung in neue ECMAscript-Objektfunktionen

Inhaltsverzeichnis 1. Objekteigenschaften 1.1 Att...

MySQL-Deduplizierungsmethoden

MySQL-Deduplizierungsmethoden 【Anfänger】 Es gibt ...

Analyse des Prozesses der einfachen Bereitstellung von Nginx im Docker-Container

1. Stellen Sie den Nginx-Dienst im Container bere...

Beispiel für die Verwendung von JS, um zu bestimmen, ob ein Element ein Array ist

Hier sind die Arten von Daten, die überprüft werd...

Lösung für den Konfigurationsfehler des Nginx-SSL-Zertifikats

1. Einleitung Wenn ein Webprojekt auf unserem Lin...

Vertikales und horizontales Aufteilen von MySQL-Tabellen

Vertikale Teilung Vertikale Aufteilung bezieht si...

So verwenden Sie SessionStorage und LocalStorage in Javascript

Inhaltsverzeichnis Vorwort Einführung in SessionS...