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

Python schreibt die Ausgabe in den CSV-Vorgang

Wie unten dargestellt: def test_write(selbst): Fe...

Detaillierte Erläuterung der grundlegenden Docker-Netzwerkkonfiguration

Externer Zugriff Ports nach dem Zufallsprinzip zu...

4 Möglichkeiten zur Implementierung von Routing-Übergangseffekten in Vue

Vue-Router-Übergänge sind eine schnelle und einfa...

Implementierung der automatischen Vervollständigung von Docker-Befehlen

Vorwort Ich weiß nicht, wie lange dieser Freund D...

MySQL-Paket für Abfrage ist zu groß – Problem und Lösung

Problembeschreibung: Fehlermeldung: Ursache: com....

Einführung in den Installationsprozess von MySQL 8.0 in einer Linux-Umgebung

Inhaltsverzeichnis Vorwort 1. Linux ändert die Yu...

Implementierung der vertikalen Zentrierung mit unbekannter Höhe in CSS

Dieser Artikel stellt hauptsächlich die Implement...

JavaScript-Quellcode für Elimination

JavaScript zum Erreichen der Quellcode-Download-A...

Zusammenfassung zur Verwendung des Ausrufezeichen-Befehls (!) unter Linux

Vorwort Vor kurzem hat unsere Firma MBP konfiguri...

So erzwingen Sie die vertikale Anzeige auf mobilen Seiten

Ich habe kürzlich bei der Arbeit eine mobile Seit...