Heim System-Tutorial LINUX Ein tiefer Einblick in fortgeschrittene Linux-Debugger-Themen

Ein tiefer Einblick in fortgeschrittene Linux-Debugger-Themen

Jan 08, 2024 pm 10:42 PM
linux linux教程 红帽 linux系统 linux命令 Linux-Zertifizierung Red Hat Linux Linux-Video

Einführung Endlich sind wir beim letzten Artikel dieser Serie angelangt! Dieses Mal gebe ich einen allgemeinen Überblick über einige der fortgeschritteneren Konzepte beim Debuggen: Remote-Debugging, Unterstützung gemeinsam genutzter Bibliotheken, Ausdrucksauswertung und Multithreading-Unterstützung. Die Umsetzung dieser Ideen ist komplexer, daher werde ich nicht näher auf die Umsetzung eingehen, beantworte aber gerne Fragen zu diesen Konzepten, wenn Sie Fragen haben.
Serienindex
  1. Bereiten Sie die Umgebung vor
  2. Haltepunkt
  3. Register und Speicher
  4. Elfen und Zwerge
  5. Quellcode und Signale
  6. Die Quellcodeschicht wird Schritt für Schritt ausgeführt
  7. Haltepunkte der Quellcodeebene
  8. Anrufstapel
  9. Variablen verarbeiten
  10. Premium-Theme
Remote-Debugging

Remote-Debugging ist sehr nützlich für eingebettete Systeme oder das Debuggen verschiedener Umgebungen. Außerdem wird eine schmale Grenze zwischen High-Level-Debugger-Operationen und der Interaktion mit dem Betriebssystem und der Hardware gezogen. Tatsächlich können Debugger wie GDB und LLDB auch beim Debuggen lokaler Programme als Remote-Debugger ausgeführt werden. Die allgemeine Struktur ist wie folgt:
Linux 调试器之高级主题!

debugarch

Der Debugger ist die Komponente, mit der wir über die Befehlszeile interagieren. Wenn Sie eine IDE verwenden, gibt es möglicherweise eine weitere Ebene darüber, die über die Maschinenschnittstelle mit dem Debugger kommuniziert. Auf dem Zielcomputer (wahrscheinlich derselbe wie der native Computer) gibt es einen Debug-Stub, der theoretisch ein Wrapper um eine sehr kleine Debugging-Bibliothek des Betriebssystems ist, die alle Debugging-Aufgaben auf niedriger Ebene ausführt, wie das Setzen von Haltepunkten für Adressen. Ich sage „theoretisch“, weil Debug-Stubs heutzutage immer größer werden. Beispielsweise beträgt die Größe des LLDB-Debug-Stubs auf meinem Computer 7,6 MB. Der Debug-Stub kommuniziert mit dem debuggten Prozess und dem Debugger über das Remote-Protokoll, indem er einige betriebssystemspezifische Funktionen nutzt (in unserem Fall ptrace).
Das gebräuchlichste Remote-Debugging-Protokoll ist das GDB-Remote-Protokoll. Dabei handelt es sich um ein textbasiertes Paketformat, das zur Weitergabe von Befehlen und Informationen zwischen dem Debugger und den Debug-Stubs verwendet wird. Ich werde nicht näher darauf eingehen, aber Sie können hier weiterlesen. Wenn Sie LLDB starten und den Befehl log enable gdb-remote packets ausführen, erhalten Sie einen Trace aller über das Remote-Protokoll gesendeten Pakete. Auf GDB können Sie dasselbe mit set remotelogfile tun.

Als einfaches Beispiel ist dies das Paket, für das ein Haltepunkt festgelegt werden soll:

$Z0,400570,1#43
Nach dem Login kopieren

$ markiert den Anfang des Pakets. Z0 ist der Befehl zum Einfügen eines Speicherhaltepunkts. 400570 und 1 sind Parameter, wobei ersterer die Adresse zum Festlegen des Haltepunkts und letzterer der Haltepunkttypbezeichner für ein bestimmtes Ziel ist. Schließlich ist #43 eine Prüfsumme, um sicherzustellen, dass die Daten nicht beschädigt sind.

Das GDB-Remote-Protokoll lässt sich sehr einfach mit benutzerdefinierten Paketen erweitern, was für die Implementierung plattform- oder sprachspezifischer Funktionen nützlich ist.

Freigegebene Bibliotheken und Unterstützung für dynamisches Laden

Der Debugger muss wissen, welche gemeinsam genutzten Bibliotheken vom zu debuggenden Programm geladen werden, damit er Haltepunkte setzen, Informationen und Symbole auf Quellcodeebene abrufen usw. kann. Neben der Suche nach dynamisch verknüpften Bibliotheken muss der Debugger auch Bibliotheken verfolgen, die zur Laufzeit über dlopen geladen werden. Um diesen Zweck zu erreichen, unterhält der dynamische Linker eine Schnittstruktur. Diese Struktur verwaltet eine verknüpfte Liste gemeinsam genutzter Bibliotheksdeskriptoren sowie einen Zeiger auf eine Funktion, die immer dann aufgerufen wird, wenn die verknüpfte Liste aktualisiert wird. Diese Struktur wird im Abschnitt .dynamic der ELF-Datei gespeichert und vor der Programmausführung initialisiert.

Ein einfacher Tracking-Algorithmus:

  • Der Tracer sucht nach dem Programmeintrag im ELF-Header (oder kann Hilfsvektoren verwenden, die in /proc//aux gespeichert sind).
  • Das Ablaufverfolgungsprogramm setzt einen Haltepunkt am Eingang des Programms und startet die Ausführung.
  • Wenn der Haltepunkt erreicht ist, finden Sie die Adresse der Schnittpunktstruktur, indem Sie in der ELF-Datei nach der Ladeadresse von .dynamic suchen.
  • Überprüfen Sie die Schnittpunktstruktur auf eine Liste der aktuell geladenen Bibliotheken.
  • Setzen Sie einen Haltepunkt für die Linker-Update-Funktion.
  • Die Liste wird jedes Mal aktualisiert, wenn ein Haltepunkt erreicht wird.
  • Das Tracking-Programm führt eine Endlosschleife aus, führt das Programm weiter aus und wartet auf Signale, bis das Signal des Tracking-Programms beendet wird.

Ich habe ein kleines Beispiel dieser Konzepte geschrieben, das Sie hier finden können. Ich kann in Zukunft ausführlicher schreiben, wenn jemand Interesse hat.

Ausdrucksberechnung

Ausdrucksauswertung ist eine Funktion des Programms, die es Benutzern ermöglicht, Ausdrücke in der ursprünglichen Quellsprache auszuwerten, während sie das Programm debuggen. Beispielsweise können Sie in LLDB oder GDB print foo() ausführen, um die foo-Funktion aufzurufen und das Ergebnis zu drucken.

Je nach Komplexität des Ausdrucks gibt es verschiedene Berechnungsmethoden. Wenn es sich bei dem Ausdruck nur um einen einfachen Bezeichner handelt, kann der Debugger die Debug-Informationen einsehen, die Variable finden und den Wert ausdrucken, genau wie wir es im letzten Teil dieser Serie getan haben. Wenn der Ausdruck etwas komplex ist, kann es möglich sein, den Code in einen Zwischenausdruck (IR) zu kompilieren und ihn zu interpretieren, um das Ergebnis zu erhalten. Beispielsweise verwendet LLDB für einige Ausdrücke Clang, um den Ausdruck in eine LLVM-IR zu kompilieren und zu interpretieren. Wenn der Ausdruck komplexer ist oder den Aufruf bestimmter Funktionen erfordert, muss der Code möglicherweise per JIT an das Ziel gesendet und im Adressraum des Debuggers ausgeführt werden. Dazu gehört der Aufruf von mmap, um ausführbaren Speicher zu reservieren, dann das Kopieren des kompilierten Codes in diesen Block und die Ausführung. LLDB wird mithilfe der JIT-Funktionen von LLVM implementiert.

Wenn Sie mehr über die JIT-Kompilierung erfahren möchten, kann ich Eli Benderskys Artikel zu diesem Thema wärmstens empfehlen.

多线程调试支持

本系列展示的调试器仅支持单线程应用程序,但是为了调试大多数真实程序,多线程支持是非常需要的。支持这一点的最简单的方法是跟踪线程的创建,并解析 procfs 以获取所需的信息。

Linux 线程库称为 pthreads。当调用 pthread_create 时,库会使用 clone 系统调用来创建一个新的线程,我们可以用 ptrace 跟踪这个系统调用(假设你的内核早于 2.5.46)。为此,你需要在连接到调试器之后设置一些 ptrace 选项:

ptrace(PTRACE_SETOPTIONS, m_pid, nullptr, PTRACE_O_TRACECLONE);
Nach dem Login kopieren

现在当 clone 被调用时,该进程将收到我们的老朋友 SIGTRAP 信号。对于本系列中的调试器,你可以将一个例子添加到 handle_sigtrap 来处理新线程的创建:

case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)):
//get the new thread ID
unsigned long event_message = 0;
ptrace(PTRACE_GETEVENTMSG, pid, nullptr, message);
//handle creation
//...
Nach dem Login kopieren

一旦收到了,你可以看看 /proc//task/ 并查看内存映射之类来获得所需的所有信息。

GDB 使用 libthread_db,它提供了一堆帮助函数,这样你就不需要自己解析和处理。设置这个库很奇怪,我不会在这展示它如何工作,但如果你想使用它,你可以去阅读这个教程。

多线程支持中最复杂的部分是调试器中线程状态的建模,特别是如果你希望支持不间断模式或当你计算中涉及不止一个 CPU 的某种异构调试。

最后!

呼!这个系列花了很长时间才写完,但是我在这个过程中学到了很多东西,我希望它是有帮助的。如果你有关于调试或本系列中的任何问题,请在 Twitter @TartanLlama或评论区联系我。如果你有想看到的其他任何调试主题,让我知道我或许会再发其他的文章。

Das obige ist der detaillierte Inhalt vonEin tiefer Einblick in fortgeschrittene Linux-Debugger-Themen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Apr 02, 2025 am 06:36 AM

Verwenden Sie Python im Linux -Terminal ...

Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Apr 03, 2025 pm 03:00 PM

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

So öffnen Sie Web.xml So öffnen Sie Web.xml Apr 03, 2025 am 06:51 AM

Um eine Web.xml -Datei zu öffnen, können Sie die folgenden Methoden verwenden: Verwenden Sie einen Texteditor (z.

Kann der Python -Dolmetscher im Linux -System gelöscht werden? Kann der Python -Dolmetscher im Linux -System gelöscht werden? Apr 02, 2025 am 07:00 AM

In Bezug auf das Problem der Entfernung des Python -Dolmetschers, das mit Linux -Systemen ausgestattet ist, werden viele Linux -Verteilungen den Python -Dolmetscher bei der Installation vorinstallieren, und verwendet den Paketmanager nicht ...

Wofür wird der Linux am besten verwendet? Wofür wird der Linux am besten verwendet? Apr 03, 2025 am 12:11 AM

Linux wird am besten als Serververwaltung, eingebettete Systeme und Desktop -Umgebungen verwendet. 1) In der Serververwaltung wird Linux verwendet, um Websites, Datenbanken und Anwendungen zu hosten und Stabilität und Zuverlässigkeit bereitzustellen. 2) In eingebetteten Systemen wird Linux aufgrund seiner Flexibilität und Stabilität in Smart Home und Automotive Electronic Systems häufig verwendet. 3) In der Desktop -Umgebung bietet Linux reichhaltige Anwendungen und eine effiziente Leistung.

Wie ist Debian Hadoop -Kompatibilität? Wie ist Debian Hadoop -Kompatibilität? Apr 02, 2025 am 08:42 AM

Debianlinux ist bekannt für seine Stabilität und Sicherheit und wird in Server-, Entwicklungs- und Desktop -Umgebungen häufig verwendet. Während es derzeit einen Mangel an offiziellen Anweisungen zur direkten Kompatibilität mit Debian und Hadoop gibt, wird dieser Artikel Sie dazu veranlassen, Hadoop in Ihrem Debian -System bereitzustellen. Debian -Systemanforderungen: Bevor Sie mit der Hadoop -Konfiguration beginnen, stellen Sie bitte sicher, dass Ihr Debian -System die Mindestanforderungen von Hadoop erfüllt, einschließlich der Installation der erforderlichen Java -Laufzeitumgebung (JRE) und Hadoop -Pakete. Schritte zur Bereitstellung von Hadoop -Bereitstellungen: Download und Unzip Hadoop: Laden Sie die Hadoop -Version von der offiziellen Apachehadoop -Website herunter und lösen Sie sie

Muss ich einen Oracle -Client installieren, wenn ich mit GO eine Verbindung zu einer Oracle -Datenbank herstellen kann? Muss ich einen Oracle -Client installieren, wenn ich mit GO eine Verbindung zu einer Oracle -Datenbank herstellen kann? Apr 02, 2025 pm 03:48 PM

Muss ich einen Oracle -Client installieren, wenn ich mit GO eine Verbindung zu einer Oracle -Datenbank herstellen kann? Bei der Entwicklung in Go ist die Verbindung zu Oracle -Datenbanken eine übliche Anforderung ...

Ist Debian Strings kompatibel mit mehreren Browsern Ist Debian Strings kompatibel mit mehreren Browsern Apr 02, 2025 am 08:30 AM

"DebianStrings" ist kein Standardbegriff und seine spezifische Bedeutung ist noch unklar. Dieser Artikel kann seine Browserkompatibilität nicht direkt kommentieren. Wenn sich jedoch "DebianStrings" auf eine Webanwendung bezieht, die auf einem Debian -System ausgeführt wird, hängt seine Browserkompatibilität von der technischen Architektur der Anwendung selbst ab. Die meisten modernen Webanwendungen sind für die Kompatibilität des Cross-Browsers verpflichtet. Dies beruht auf den folgenden Webstandards und der Verwendung gut kompatibler Front-End-Technologien (wie HTML, CSS, JavaScript) und Back-End-Technologien (wie PHP, Python, Node.js usw.). Um sicherzustellen, dass die Anwendung mit mehreren Browsern kompatibel ist, müssen Entwickler häufig Kreuzbrowser-Tests durchführen und die Reaktionsfähigkeit verwenden

See all articles