Nalagodzhenya für zusätzliche Hilfe GDB. Vyvchaemo Mit vykoristanny GDB Reduzierung des untergeordneten Prozesses

G.D.B. Gehen Sie zu den „vernünftigen“ Programmen, z. B. zu denen, die den Code „verstehen“ und ihn nacheinander abwickeln, die Werte von Änderungen ändern, Kontrollpunkte festlegen und Brainstormings durchführen ... Mit einem Wort, tun Sie alles, damit die Entwickler zu Und überprüfen Sie, ob Ihre Programme ordnungsgemäß ausgeführt werden.

G.D.B. reiche Erinnerungen UNIX-Solche Systeme übernehmen auch die Feinabstimmung vieler Programme. Si ist unter ihnen.

Kontaktiere uns G.D.B. Geben Sie den Befehl am Terminal ein

Gdb

Einloggen G.D.B.: Befehl eingeben

Beenden oder C –d

Weitere wichtige GDB-Befehle

run [Befehlszeilenargumente des Programms] Führen Sie das Programm aus. break [Zeilennummer / Funktionsname] Platzieren Sie einen Programmunterbrechungspunkt in der nächsten Zeile oder Funktion. Weiter Gehen Sie zur Angriffsreihe, ohne in die Mitte der Funktion zu gehen. Schritt Gehe zur Schrittreihe. Wenn sich in der Zeile eine Funktion befindet, gehen Sie zu dieser. list Geben Sie einen Fragment des Programmcodes ein (eine Reihe von Zeilen um die Stelle, an der ein Punkt eingefügt wird). print [change] Geben Sie den Wert der Änderung auf dem Bildschirm ein. info locals Geben Sie die genauen Werte aller lokalen Änderungen in der Mitte der Schleife, Funktion usw. ein. display [change] Geben Sie den Wert der Änderung auf der Haut der Haut ein. help Zeigt eine Liste aller vorhandenen GDB-Befehle an.

Lassen Sie uns staunen, wie man mit GDB an der Anwendung caesar.c arbeitet, wie Sie, der Sie alles für alles getan haben, bereits letztes Jahr geschrieben haben. Wir werden es anhand der älteren Version überprüfen, sodass Ihre Ergebnisse je nach Implementierung variieren können.

Gehen wir nun zum Ordner „pset2“ (wir denken, Sie wissen bereits, wie Sie ihn erhalten) im „CS50 Virtual Laboratory“ oder in der CS50-IDE. Geben Sie den Befehl ein:

Gdb. /Caesar

Das Caesar-Programm hat eine Funktion: main. Legen wir den Startpunkt des Programms auf die Hauptfunktion fest:

Hauptunterbrechung

Lassen Sie uns das Caesar-Programm mit dem Argument „3“ ausführen:

Lauf 13

Nehmen wir an, wir müssen die Werte von argc überprüfen:

argc drucken

Die Achse ist im Terminalfenster zu sehen:

Nun schließen wir das Programm mit dem nächsten Befehl Schritt für Schritt ab. Wir können ein paar Mal sehen.

Hier gibt der veränderbare Schlüssel Bedeutung. Schauen wir uns an, welche Bedeutung es in dieser Zeile hat:

Beim ersten Klick wird der veränderbare Schlüssel auf „0“ gesetzt. Warum haben wir die Nummer 3 verpasst? Auf der rechten Seite ist zu sehen, dass das Team Vikonan noch nicht betreten hat. Bei weiteren Eingaben werden Sie vom Programm zur Texteingabe aufgefordert.

Nachdem wir den Befehl „Weiter“ noch einmal eingegeben haben, befinden wir uns in der Mitte der mentalen Schleife.

Meta-Verbesserung von Programmen – Entfernung von Änderungen aus dem Code. Warum haben Sie, der Sie alles gewusst haben, die Möglichkeit, das Lager der Berühmten aufzuspüren? Stunde Wyconnanny, Dies ist dasselbe wie der Erkenntnisprozess selbst (z. B. das Durchführen mentaler Übergänge). Hier ist der Leiter unser erster Assistent. Natürlich bietet C viele Möglichkeiten, Programme problemlos auszuführen: von einem einfachen printf(3) bis hin zu speziellen Protokollierungssystemen im gesamten Syslog-Netzwerk. In Assembler stagnieren solche Methoden immer noch, andernfalls müssen Sie möglicherweise auf Register, RAM-Dumps und andere Sprachen achten, die in einem interaktiven Editor viel einfacher zu entwickeln sind. Übrigens: Wenn Sie in Assembler schreiben, werden Sie wahrscheinlich nicht ohne einen Editor auskommen.

Sie können beginnen, indem Sie einen Haltepunkt festlegen, da Sie bereits ungefähr wissen, welchem ​​Teil des Codes Sie folgen müssen. Dies ist die am häufigsten verwendete Methode: Einen Punkt setzen, das Programm starten und Schritt für Schritt durchgehen, dabei die notwendigen Änderungen und Register im Auge behalten. Sie können das Programm auch einfach unter den besten Bedingungen ausführen und für den Fall, dass es aufgrund eines Segmentierungsfehlers abstürzt, so können Sie herausfinden, welche Anweisung den Zugriff auf den Speicher verweigern soll, sich dann die Änderung ansehen und so weiter. . Jetzt können Sie diesem Code noch einmal folgen, ihn Schritt für Schritt durchgehen und kurz vor dem Moment des Scheiterns einen Punkt setzen.

Machen wir es einfach. Nehmen wir das Hello World-Programm und kompilieren es mit dem Compiler-Schalter -g mit den notwendigen Informationen:

$ gcc -g hallo.s -o hallo $

GDB starten:

$ gdb ./hello GNU gdb 6.4.90-debian Copyright (C) 2006 Free Software Foundation, Inc. GDB ist freie Software, die unter der GNU General Public License lizenziert ist und Sie beabsichtigen, sie zu ändern und/oder Kopien davon an andere Personen zu verteilen. Geben Sie „Kopieren anzeigen“ ein, um die Bedingungen anzuzeigen. Dies ist absolut keine Garantie für GDB. Für Einzelheiten geben Sie „Garantie anzeigen“ ein. Diese GDB ist als „i486-linux-gnu“ konfiguriert...unter Verwendung der Host-Libthread_db-Bibliothek „/lib/tls/libthread_db.so.1“. (gdb)

GDB wurde gestartet, das folgende Programm gestartet, auf den Anforderungsbildschirm (gdb) geschaut und nach Befehlen gesucht. Wir wollen das Programm „in Schritten“ durchgehen (Einzelschrittmodus). Dazu müssen Sie den Befehl angeben, mit dem das Programm ausgeführt werden kann. Sie können ein Unterprogramm angeben. Dies geschieht, bevor mit den letzten Anweisungen für dieses Unterprogramm begonnen wird. Sie können auch den Dateinamen und die Zeilennummer angeben.

(gdb) b main Breakpoint 1 bei 0x8048324: Datei hello.s, Zeile 17. (gdb)

b - kurzfristige Pause. Alle GDB-Befehle können gekürzt werden, da sie keine doppelwertigen Entschlüsselungen erzeugen. Wir starten das Programm mit dem Befehl „run“. Dieser Befehl wird verwendet, um zuvor laufende Programme neu zu starten.

(gdb) r Programm starten: /tmp/hello Haltepunkt 1, main () bei hello.s:17 17 movl $4, %eax /* setze die Systemnummer write = 4 Aktuelle Sprache: auto; derzeit asm (gdb)

GDB lädt das Programm herunter und prüft die Befehle. Geben Sie den Befehl Ihres Programms an, der im nächsten Schritt hinzugefügt wird, die Funktionen, die der Datei hinzugefügt werden, und die Zeilennummer. Für ein zeilenweises Wiki können wir zwei Befehle verwenden: step (abgekürzt als s) und next (abgekürzt als n). Der Schrittbefehl beendet das Programm durch Aufrufen des Unterprogrammabschnitts. Der nächste Befehl führt die Anweisungen des Thread-Unterprogramms Stück für Stück aus.

(gdb) n 20 movl $1, %ebx /* erster Parameter – zum Registrieren von %ebx */ (gdb)

Jetzt sind die Anweisungen für Zeile 17 geschrieben und wir verstehen, dass das %eax-Register die Nummer 4 enthält. Um verschiedene Viren auf dem Bildschirm anzuzeigen, verwenden Sie den Befehl print (abgekürzt p). Beim Ersetzen von Assembler-Befehlen verfügt GDB über ein $replace %-Zeichen im Registereintrag. Sehen wir uns an, was in der %eax-Registrierung enthalten ist:

(gdb) p $eax $1 = 4 (gdb)

Aktion 4! GDB nummeriert alle Ausdrucksausgaben. Jetzt haben wir den ersten Virus ($1), der älter als 4 ist. Bis zu diesem Virus können Sie ihn jetzt beantragen. Sie können auch einfache Berechnungen durchführen:

(gdb) p $1 $2 = 4 (gdb) p $1 + 10 $3 = 14 (gdb) p 0x10 + 0x1f $4 = 47 (gdb)

Während wir mit dem Druckbefehl spielten, hatten wir bereits vergessen, wie die Anweisung endet. Der Infozeilenbefehl zeigt Informationen zu den Anweisungen in der Codezeile an. Ohne Argumente Informationen über die Produktionslinie anzeigen.

(gdb) Infozeile Zeile 20 von „hello.s“ beginnt bei der Adresse 0x8048329 und endet bei 0x804832e . (gdb)

Der Befehl list (abgekürzt l) zeigt den Ausgabecode Ihres Programms auf dem Bildschirm an. So können Argumente übergeben werden:

  • Zeilennummer- Zeilennummer der Flow-Datei;
  • Datei: Zeilennummer- Zeilennummer für die angegebene Datei;
  • Ihre_Funktionen- Sie haben eindeutige Funktionen;
  • Datei: Funktionsname- Funktionen für die angegebene Datei haben;
  • *Adressen- Adressen im Speicher, gefolgt von den notwendigen Anweisungen.

Wenn Sie ein Argument übergeben, erzeugt der Listenbefehl 10 Zeilen Ausgabecode an derselben Stelle. Durch die Übergabe von zwei Argumenten geben Sie die Zeile am Anfang und die Zeile am Ende der Auflistung an.

(gdb) l main 12 hinter den Grenzen dieser Datei */ 13 .type main, @function /* main - Funktion (keine Daten) */ 14 15 16 main: 17 movl $4, %eax /* Geben Sie die Nummer ein Systemaufruf 18 write = 4 in Register %eax */ 19 20 movl $1, %ebx /* platziere den ersten Parameter in Register 21 %ebx; Dateideskriptornummer 22 stdout = 1 */ (gdb) l *$eip 0x8048329 ist bei hello.s:20. 15 16 main: 17 movl $4, %eax /* Platziere die Systemaufrufnummer 18 write = 4 in das Register %eax */ 19 20 movl $1, %ebx /* Platziere den ersten Parameter in Register 21 %ebx; Dateideskriptornummer 22 stdout = 1 */ 23 movl $hello_str, %ecx /* platziere einen weiteren Parameter in Register 24 %ecx; Indikator pro Zeile */ (gdb) l 20, 25 20 movl $1, %ebx /* Platziere den ersten Parameter in Register 21 %ebx; Dateideskriptornummer 22 stdout = 1 */ 23 movl $hello_str, %ecx /* platziere einen weiteren Parameter in Register 24 %ecx; Indikator pro Zeile */25 (gdb)

Merken Sie sich diesen Befehl: list $eip. Mit dieser Hilfe können Sie später den Ausgabecode neben den sofort geschriebenen Anweisungen betrachten. Lassen Sie uns unser Programm fertigstellen:

(gdb) n 23 movl $hello_str, %ecx /* Platziere einen weiteren Parameter im Register %ecx (gdb) n 26 movl $hello_str_length, %edx /* Platziere den dritten Parameter im Register %edx (gdb)

Das stimmt nicht, ich habe es satt, n? Wenn Sie einfach die Eingabetaste drücken, wiederholt GDB den verbleibenden Befehl:

(gdb) 29 int $0x80 /* wiklikati pererivannya 0x80 */ (gdb) Hallo Welt! 31 movl $1, %eax /* System-Wiki-Nummer Exit = 1 */ (gdb)

Ein weiterer praktischer Befehl zum Thema Yaku Varto Adel – Inforegister. Natürlich kann її zu i r abgekürzt werden. Sie können ihm einen Parameter übergeben – eine Liste von Registern, die konfiguriert werden müssen. Wenn die Anmeldung beispielsweise in einem geschützten Modus generiert wird, ist es unwahrscheinlich, dass wir die Werte der Segmentregister übersehen.

(gdb) Inforegister eax 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xb0 1208566592 eip 0x804833a 0x 80 4833a eflags 0x246 [PF ZF IF] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) Inforegister 0xe 14 ecx 0x804955c 134518108 edx 0x e 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xbfabb5a8 esi 0x0 0 edi 0xb7f6bcc0 -1208566592 eip 0x804833a 0x804 eflags 0x246 [PF ZF IF] (gdb)

Zusätzlich zu den Registern haben wir also auch

Heute verdienst du einen weiteren Krok von rechts
Vivchennya Linux-Systeme. Ich erzähle Ihnen die Grundlagen
Nehmen Sie Ihre Arbeit mit gdb auf. Wenn Sie sie beherrschen, können Sie verstehen, wie jedes Programm funktioniert, und Ihre eigenen Exploits schreiben.

Sie haben vielleicht alle von einer solchen Rede als Mechaniker gehört, GDB – das ist dasselbe wie ein Reparateur. GDB-GNU
Debugger. Dies ähnelt SoftICE für Windows (für diejenigen, die es nicht wissen, es ist das beliebteste und meiner Meinung nach auch das nützlichste), nur unter
Linux-Systeme. Auf der rechten Seite gibt es nicht so viele Dokumente, die die Arbeit dieser Rede belegen, und ich habe sie selbst gemeistert. Otje,
Das Dokument beschreibt die grundlegenden GDB-Befehle. Alles wird am Beispiel gezeigt. Und als Hintern habe ich beschlossen, das Programm ja zu nehmen. Für diejenigen, die es nicht wissen: Dieses Programm druckt einfach das „y“-Symbol, bis es endlos ist, also habe ich beschlossen zu lernen, wie man nicht dieses Symbol, sondern die Zeile „XAKEP“ druckt, was mehr Spaß machen würde.

Nun, jetzt ist alles in Ordnung. Der Editor selbst startet folgendermaßen:

Wenn Sie verschiedene Parameter eingeben können, haben wir eine Möglichkeit, dem Programm zu folgen:

# gdb /usr/bin/yes

Sie können die Kerndateien anzeigen, für die Sie Folgendes eingeben müssen:

# gdb /usr/bin/yes core

Möglicherweise benötigen Sie stattdessen auch einen Befehl, um Register anzuzeigen:

(gdb) Inforegister

oder so (Kurzfassung)

Schauen wir uns nun an, wie der Robiti übersprungen wurde. Es huscht
Punkte der Verwirrung, Punkte der Überfüllung und Punkte der Vorsicht. Genauer gesagt möchte ich mich auf die Lernpunkte konzentrieren. Es kann installiert werden auf:

(gdb) Funktion unterbrechen - Zupinity vor dem Aufrufen der Funktion
(gdb) break *adress – Senden, bevor Sie den Anweisungen für die Adresse folgen.

Nach der Installation können Sie sich alle Punkte ansehen, für die Sie den Befehl verwenden:

(gdb) Infopause

Und dann können Sie diese Punkte löschen:

(gdb) Clear Breakpoint – de break ist der Name des Breakpoints
(zum Beispiel Funktion oder Adresse)

Ein weiteres wichtiges Feature ist die Möglichkeit, nach Abschluss von Programmen automatisch verschiedene Werte anzuzeigen. Was ist der Zweck des Anzeigebefehls:

(gdb) display/format value , wobei format das Format der Anzeige und value das Format ist, das angezeigt werden muss.

Für die Arbeit mit Bildern stehen folgende Befehle zur Verfügung:

(gdb) Info-Anzeige – zeigt Informationen zur Anzeige an
(gdb) delete num – de num – Elemente mit Index löschen
Num

Dies wird ein kleiner Leitfaden der Teams sein, um die Hauptidee zu verstehen.
Weiter unten am Hintern möchte ich noch etwas mehr demonstrieren. Und denken Sie daran – hier habe ich nur einen kleinen Teil aller Möglichkeiten von gdb aufgeführt, tatsächlich gibt es hundertmal mehr davon, also lesen Sie und beginnen Sie.
Da ich obіtsya habe, werden wir das Prog ja nicht brauchen. Der Weg zu deinem Auto lässt sich bei meinem vielleicht nicht vermeiden, alles liegt an dem Betriebssystem, das du verwendest, wenn du durch Suchen (Befehl
finden).

# gdb /usr/bin/yes

Nach dem Start erhalten Sie detaillierte Informationen.

GNU gdb 19991004




Dies ist absolut keine Garantie für GDB. Für Einzelheiten geben Sie „Garantie anzeigen“ ein.
Tsei GDB buv wie „i386-redhat-linux“ optimiert ...
(keine Debugging-Symbole gefunden)...

Da wir ja unendlich viele Symbole anzeigen können, wäre es besser, wenn wir sie nicht aus dem Editor herunterladen würden, sondern noch einmal
Programme können auf eine andere Konsole geleitet werden. Öffnen Sie ein neues Terminal, geben Sie „who is i“ ein und öffnen Sie den Konsolennamen. Es ist deine Schuld, rauszukommen
Schauen wir uns das Bild an:

Die Achse wird nun einfach damit verknüpft.

(gdb) tty /dev/pts/1

Lassen Sie uns nun einen Punkt auf die Funktion puts() setzen, um Ihnen das Verständnis der Man-Informationen über die Funktion (Man-Befehl) zu erleichtern
setzt)

#enthalten
int puts (const char * s);
puts() schreibt die Zeichenfolge s und den nachfolgenden Zeilenumbruch in std
aus.

Wie Sie sehen können, wird die Funktion auf die angezeigten Zeilen angewendet. Diese Achse ist das, was wir brauchen. Wir stecken immer noch darin fest.

(gdb) Break-Puts
Haltepunkt 1 bei 0x8048698

І Starten Sie das Programm selbst, damit Sie die GDB-Docks überprüfen und nicht vergessen, auf die Funktionen zu klicken.

(gdb)r
Startprogramm: /usr/bin/yes
Haltepunkt 1 bei 0x4006d585: Datei ioputs.c, Zeile 32.

Haltepunkt 1, 0x4006d585 in _IO_puts (str=0x8048e59 „y“) bei ioputs.c:32
32 ioputs.c: Keine solche Datei oder kein solches Verzeichnis.
1: x/i $eip 0x4006d585<_IO_puts+21>: mov 0x8(%ebp),%esi

Oh, die i-Achse wurde zu einem Wunder, indem sie einen Haltepunkt schuf. Was uns wichtig ist – und was uns wichtig ist, ist etwas anderes, etwa ein Parameter einer Funktion, oder besser gesagt die Adresse, an der er liegen soll. Was brauchen Sie jetzt?
Geld verdienen? Richtig, senden Sie die Daten an diese Adresse. Damit werden wir noch ein paar eigene Symbole hinzufügen.

(gdb) set (char)0x8048e59="X"
(gdb) set (char)0x8048e5a="A"
(gdb) set (char)0x8048e5b="K"
(gdb) set (char)0x8048e5c="E"
(gdb) set (char)0x8048e5d="P"

Nun lasst uns unseren Vitvir bestaunen. Was liegt dort in Erinnerung:

(gdb) x/3sw 0x8048e59
0x8048e59<_IO_stdin_used+437>: „XAKEP\004\b“
0x8048e61<_IO_stdin_used+445>: ""
0x8048e62<_IO_stdin_used+446>: ""

Jetzt können wir unseren Haltepunkt sehen:

(gdb) Infopause
Num Typ Disp Enb Adresse Was
1 Haltepunkt behält y 0x4006d585 in _IO_puts bei ioputs.c:32
Der Haltepunkt wurde bereits 1 Mal erreicht
(gdb) klare Puts
Haltepunkt 1 gelöscht

Ich fahre fort, um das Ergebnis zu genießen:

Das ist alles. Scheinbar.

(gdb)q
Das Programm läuft. Trotzdem aussteigen? (j oder n)j

Wo die Übung endet, entscheiden Sie selbst und denken Sie daran, was in Ihrem Leben wichtig ist.
Die Achsen der Roboter sind:

Bestätigung vor diesem Vorgang:

// gdb starten
hack@exploit:~ > gdb
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB ist freie Software, die der GNU General Public License unterliegt
Gerne können Sie es unter bestimmten Bedingungen ändern und/oder Kopien davon verteilen.
Geben Sie „Kopieren anzeigen“ ein, um die Bedingungen anzuzeigen.
Dies ist absolut keine Garantie für GDB. Geben Sie „Garantie anzeigen“ für ein
Einzelheiten.
Qia GDB wurde als „i386-suse-linux“ konfiguriert.
(gdb) „pid“ anhängen
(gdb) 1127 // Beispiel anhängen

Suche nach Speicher:

(gdb) x/d oder x „Adresse“ zeigt Dezimalzahl an
(gdb) x/100s „Adresse“ zeigt die nächsten 100 Dezimalstellen an
(gdb) x 0x0804846c Dezimalzahl bei 0x0804846c anzeigen
(gdb) x/s „address“ zeigt Zeichenfolgen an der Adresse an
(gdb) x/105 0x0804846c zeigt 105 Strings bei 0x0804846c
(gdb) x/x „Adresse“ zeigt die hexadezimale Adresse an
(gdb) x/10x 0x0804846c zeigt 10 Adressen bei 0x0804846c
(gdb) x/b 0x0804846c
(gdb) x/10b 0x0804846c-10 zeigt Byte bei 0x0804846c-10 an
(gdb) x/10b 0x0804846c+20 Byte bei 0x0804846c+20 anzeigen
(gdb) x/20i 0x0804846c zeigt 20 Assembler-Anweisungen unter Adresse

Liste aller Abschnitte in der kompilierten Datei:

(gdb) Wartungsinfoabschnitte // oder
(gdb) mai i s

Ausführbare Datei:
`/home/hack/homepage/challenge/buf/basic“, Dateityp
elf32-i386.
0x080480f4->0x08048107 bei 0x000000f4: .interp ALLOC

0x08048108->0x08048128 bei 0x00000108: .note.ABI-tag
ALLOC LOAD READONLY DATA HAS_CONTENTS
0x08048128->0x08048158 bei 0x00000128: .hash ALLOC
LADE schreibgeschützte Daten HAS_CONTENTS
0x08048158->0x080481c8 bei 0x00000158: .dynsym ALLOC
LADE schreibgeschützte Daten HAS_CONTENTS
0x080481c8->0x08048242 bei 0x000001c8: .dynstr ALLOC
LADE schreibgeschützte Daten HAS_CONTENTS
0x08048242->0x08048250 bei 0x00000242: .gnu.version
ALLOC LOAD READONLY DATA
HAS_CONTENTS

Shlyub an der Adresse:

(gdb) main zerlegen
Dump des Assembler-Codes für die Funktion main:
0x8048400

: %ebp drücken
0x8048401 : mov %esp,%ebp
0x8048403 : sub $0x408,%esp
0x8048409 : $0xfffffff8,%esp hinzufügen
0x804840c : mov 0xc(%ebp),%eax
0x804840f : $0x4,%eax hinzufügen
0x8048412 : mov (%eax),%edx
0x8048414 : %edx drücken
0x8048415 : lea 0xfffffc00(%ebp),%eax
...

(gdb) break *0x8048414 // Beispiel
Haltepunkt 1 bei 0x8048414
(gdb) break main // Beispiel
Haltepunkt 2 bei 0x8048409
(gdb)

GNU Debugger ist ein tragbares Tool für das GNU-Projekt, das auf vielen UNIX-ähnlichen Systemen läuft und eine breite Palette von Softwareprogrammen ausführt, darunter C, C++, Ada und Fortran. GNU Debugger ist ein Softwareprogramm, das unter der GNU General Public License lizenziert ist.

Basierend auf GNU Debugger, geschrieben von Richard Stallman im Jahr 1988. Es basierte auf dem DBX-Editor, der mit der BSD-Distribution geliefert wurde. Von 1990 bis 1993 Rock. Das Projekt wurde von John Gilmore während seiner frühen Karriere bei Cygnus Solutions geleitet. Die Entwicklung wird derzeit vom GDB Steering Committee koordiniert, einer Tochtergesellschaft der Free Software Foundation.

Technische Details zum GNU Debugger

  • Merkmale

GNU Debugger bietet großartige Funktionen zur Steuerung von Softwareprogrammen auf Computern. Benutzer können interne Programme ändern und Funktionen unabhängig vom ursprünglichen Programmverhalten aufrufen. GNU Debugger kann komprimierte Dateien in den Formaten a.out, COFF (einschließlich Windows-formatierter Dateien), ECOFF, XCOFF, ELF, SOM analysieren und nützliche Informationen aus den Formaten Stabs, COFF, ECOFF, DWARF und DWARF2 extrahieren. Das DWARF2-Format bietet das größte Verbesserungspotenzial.

GNU Debugger wird aktiv weiterentwickelt. Beispielsweise wurde in Version 7.0 die Funktion „Revolving Credit“ hinzugefügt, mit der Sie den Prozess der Dekonstruktion beobachten können, um zu sehen, was passiert ist. Außerdem wurde in Version 7.0 Unterstützung für Scripting hinzugefügt.

Für die Arbeit mit GNU Debugger wurden andere Entwicklungstools erstellt, beispielsweise Speichersensoren.

  • Multiplattform und Unterstützung für neue Systeme

GNU Debugger kann so kompiliert werden, dass es Programme für mehrere Plattformen unterstützt und während einer laufenden Sitzung zwischen ihnen wechselt. Von GNU Debugger (2003) unterstützte Prozessoren: Alpha, ARM, H8/300, System/370, System/390, x86 und x86-64, IA-64 (Itanium), Motorola 68000, MIPS, PA-RISC, PowerPC, SuperH , SPARC, VAX, A29K, ARC, AVR, CRIS, D10V, D30V, FR-30, FR-V, Intel i960, M32R, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32K, NS32K. (Es wird keine neuen Versionen mehr geben, die diese unterstützen.) Alle Plattformen, auf denen GNU Debugger nicht ausgeführt werden kann, sofern das System installiert ist, können die Verwendung eines integrierten Simulators (ARM-, AVR-Prozessoren) unterstützen add ki for them kann mit speziellen Unterprogrammen kompiliert werden, um eine hervorragende Leistung unter GNU Debugger sicherzustellen, der auf dem Computer des Einzelhändlers ausgeführt wird. Die zu verbessernde Eingabedatei ist in der Regel nicht die zu flashende Doppeldatei, sondern eine Datei in einem der Formate, die nützliche Informationen unterstützen, insbesondere ELF, aus denen mit Hilfe spezieller Dienstprogrammcodes für die Firmware zwei kombiniert werden.

  • Nahe

Bei der Remote-Konfiguration läuft GNU Debugger auf einem Computer und das zu ändernde Programm auf einem anderen. Die Kommunikation erfolgt über ein spezielles Protokoll über die serielle Schnittstelle oder TCP/IP. Das Protokoll für die Interaktion mit dem Debugger ist spezifisch für GNU Debugger und die Ausgabecodes der erforderlichen Unterprogramme sind in den Debugger-Archiven enthalten. Alternativ kann auf der Zielplattform das Programm gdbserver ausgeführt werden, das dasselbe Protokoll wie das GNU-Debugger-Paket verwendet und Low-Level-Funktionen für den Installationspunkt und den Zugriff auf Registrierungen und Speicher bereitstellt. yati.

Dieser Modus ist für die Interaktion mit den integrierten Linux-KGDB-Kernelfunktionen konzipiert. Mit dieser Hilfe kann der Entwickler den Kernel als primäres Programm anpassen: Speicherpunkte installieren, den Wiki-Code durcharbeiten und Änderungen überprüfen. Der Anwendungsmanager besteht aus zwei Maschinen, die über Ethernet oder ein serielles Kabel verbunden sind, wobei auf einer der GNU Debugger und auf der anderen der zu entwickelnde Kernel ausgeführt wird.

  • Koristuvalnytskyi-Schnittstelle

Im Einklang mit der Ideologie der Free Software Foundation bietet GNU Debugger anstelle einer grafischen Schnittstelle die Möglichkeit, eine Verbindung zu modernen IDEs und anderen grafischen Shells herzustellen oder die Standard-Konsolentextschnittstelle zu verwenden Um es von externen Programmen zu erhalten, können Sie die Textzeilensprache (wie in den ersten Versionen der DDD-Shell aufgeschlüsselt), die gdb/mi-Textsprache oder die Schnittstelle für die Sprache verwenden.

Schnittstellen wie DDD, cgdb, GDBtk/Insight und GUD-Modus wurden in erstellt. Die folgenden IDEs können mit GNU Debugger interagieren:

Für eine effektive Entwicklung von Programmen müssen Sie während der Kompilierung nützliche Informationen generieren. Diese wertvollen Informationen werden in einer Objektdatei gespeichert; Es beschreibt den Datentyp der Skin-Änderungen oder -Funktionen sowie die Beziehung zwischen den Zeilennummern des Ausgabetexts und den Adressen des Codes, der endet.

Um die Generierung nützlicher Informationen anzufordern, geben Sie beim Starten des Compilers den Schalter „-g“ ein.

Die meisten C-Compiler können die Schalter „-g“ und „-O“ nicht gleichzeitig verarbeiten. Mit solchen Compilern können Sie keine optimierten Dateien erstellen, die wertvolle Informationen enthalten.

GCC, der GNU C-Compiler, unterstützt „-g“ mit oder ohne „-O“, um optimierten Code zu verbessern. Wir empfehlen Ihnen Erstens Sie haben beim Kompilieren von Programmen „-g“ verwendet. Sie denken vielleicht, dass Ihr Programm korrekt ist, aber Sie verspüren keinen Erfolg.

Wenn Sie Ihr Programm mitten in einem Fenster ausführen, das Prozesse unterstützt, erstellt „Ausführen“ einen leichten Prozess, und dieser Prozess beendet Ihr Programm. (Bei Systemen, die keine Prozesse unterstützen, springt run zum Anfang Ihres Programms.)

Vikonanny-Programme liegen in Form von Informationen vor, die aus dem Prozess abgeleitet werden, der sie generiert hat. GDB bietet Möglichkeiten zur Angabe der Informationen, die Sie generieren müssen Vor Programmstart. (Sie können diese nach dem Start ändern, andernfalls werden solche Änderungen erst beim Start auf Ihr Programm angewendet.) Diese Informationen können in die folgenden Kategorien unterteilt werden: Parameter Geben Sie die Parameter an, die Ihr Programm übergeben muss, beispielsweise die Parameter des Ausführungsbefehls. Da Ihr System über eine Shell verfügt, wird diese zur Übergabe von Parametern verwendet, sodass Sie bei deren Beschreibung andere Dinge verwenden können (z. B. das Öffnen von Vorlagen oder das Ersetzen von Ersatzvorlagen). Auf Unix-Systemen können Sie steuern, welche Shell die SHELL-Middleware ersetzt. Abschnitt 4.3 Argumente für Ihr Programm. Sereda. Stellen Sie sicher, dass Ihr Programm seinen Kern in GDB erstellt, oder Sie können die GDB-Befehle „Set Environment“ und „Unset Environment“ verwenden, um die Menge des Kerns zu ändern, der hineinfließt. Abschnitt 4.4 Die Arbeitsmitte Ihres Programms. Arbeitsverzeichnis Ihr Programm speichert sein Arbeitsverzeichnis in GDB. Sie können das GDB-Arbeitsverzeichnis mit dem Befehl cd einfügen. Abschnitt 4.5 Arbeitsverzeichnis Ihres Programms. Standardeinführung und -anzeige. Stellen Sie sicher, dass Ihr Programm dieselben Geräte für die Standardeingabe und -ausgabe wie GDB verwendet. Sie können Ihre Eingabe an den Befehl „run“ umleiten oder den Befehl „tty“ verwenden, um ein anderes Gerät für Ihr Programm zu installieren. Abschnitt 4.6 Einführung und Veröffentlichung von Programmen. Im Voraus: Wenn Sie möchten, dass die Eingabe- und Ausgabeumleitung funktioniert, können Sie keine Kanäle für die Übertragung von Ausgabedaten von Programmen auswählen, die andere Programme ausführen. Wenn Sie dies versuchen, werden Sie die gesamte GDB durchgehen, bis Sie das falsche Programm installieren.

Wenn Sie den Ausführungsbefehl erteilen, beginnt Ihr Programm abzustürzen. Abt. Abschnitt 5. Entwicklung und Fortführung des Programms, um zu besprechen, wie Sie Ihr Programm verbessern können. Sobald Ihr Programm programmiert ist, können Sie Programmfunktionen mit den Befehlen print oder call aufrufen. Abschnitt 8. Datenverfolgung.

Wenn Ihre Symboldatei geändert wird, sucht GDB in dem Moment, in dem es mit dem Lesen von Symbolen beginnt, in der Symboltabelle und liest sie erneut. Auf diese Weise versucht GDB, Ihre genauen Datenpunkte zu speichern.

4.3 Argumente für Ihr Programm

Das erste ist, dass GDB nach der Vorbereitung funktionieren sollte, bis der vorgesehene Prozess etabliert ist – das ist falsch. Sie können den Ausführungsprozess mithilfe der verfügbaren GDB-Befehle überwachen und ändern, wenn Sie Prozesse mit run ausführen. Sie können die Ankerpunkte einfügen; Sie können das Programm einzeln beenden und mit dem ursprünglichen Beenden fortfahren und die Datenbereiche ändern. Wenn Sie den Bearbeitungsprozess nach dem Beitritt zu einer neuen GDB fortsetzen möchten, können Sie den Befehl continue verwenden. detach Sobald Sie den Erfassungsprozess eingerichtet haben, können Sie ihn mit dem Befehl „detach“ mit GDB verbinden. Der Prozess geht mit seinem Sieg weiter. Nach dem Befehl „detach“ werden dieser Prozess und GDB wieder vollständig unabhängig und Sie können mit „run“ einem anderen Prozess beitreten oder diesen starten. detach wird nicht wiederholt, wenn Sie nach Verlassen des Befehls erneut RET eingeben.

Wenn Sie GDB beenden oder den Befehl „run“ verwenden, während ein neuer Prozess ausgeführt wird, wird der gesamte Prozess beendet. Bei Beförderungen wird GDB Sie um eine Bestätigung bitten, wenn Sie beabsichtigen, eine dieser Reden zu absolvieren. Mit dem Set-Bestätigungsbefehl können Sie steuern, ob Sie eine Bestätigung benötigen oder nicht (Abschnitt 15.6 Unnötige Vorankündigung).

4.8 Entzug untergeordneter Prozesse

kill Suchen Sie den untergeordneten Prozess, in dem Ihr Programm unter GDB installiert ist.

Dieser Befehl ist nützlich, wenn Sie den Speicherauszug und nicht den zu speichernden Prozess verbessern möchten. GDB ignoriert alle Speicherauszüge, während das Programm beendet wird.

Auf einigen Betriebssystemen kann das Programm nicht in GDB installiert werden, solange Sie die Knoten darin vom Administrator installiert haben. In dieser Situation können Sie mit dem Kill-Befehl zulassen, dass Ihr Programm vom Administrator beendet wird.

Der Kill-Befehl ist auch nützlich, wenn Sie Ihr Programm neu kompilieren und neu verknüpfen möchten, da es auf Rich-Systemen nicht möglich ist, eine Datei zu ändern, die am Ende des Prozesses kompiliert wird. Wenn Sie in diesem Fall das nächste Mal „run“ eingeben, stellt GDB fest, dass sich die Datei geändert hat, und liest die Symboltabelle erneut (während versucht wird, Ihre Punkte zu speichern).