8.4 Ausgabeformate Standardmäßig druckt GDB einen Wert nach seinem Datentyp aus. Manchmal ist das nicht das, was du willst. Beispielsweise möchten Sie vielleicht eine Zahl in Hexe oder einen Zeiger in Dezimalzahl drucken. Oder möchten Sie vielleicht Daten im Speicher an einer bestimmten Adresse als Zeichenfolge oder als Anweisung anzeigen. Um dies zu tun, geben Sie ein Ausgabeformat an, wenn Sie einen Wert drucken. Die einfachste Verwendung von Ausgabeformaten ist, wie man einen bereits berechneten Wert ausdruckt. Dies geschieht durch das Starten der Argumente des Druckbefehls mit einem Schrägstrich und einem Formatbuchstaben. Die unterstützten Formatbuchstaben sind: x Betrachten Sie die Bits des Wertes als Ganzzahl und drucken Sie die Ganzzahl in Hexadezimal. D Als Ganzzahl in signierter Dezimalzahl drucken. U Als Integer in unsigned dezimal drucken O Als Integer im Oktal drucken T Als Integer in binär drucken. Der Buchstabe t steht für zwei. (2) a Druck als Adresse, sowohl absolut in hexadezimal als auch als Versatz aus dem nächstgelegenen Symbol. Sie können dieses Format verwenden, um zu entdecken, wo (in welcher Funktion) eine unbekannte Adresse gefunden wird: Das Befehls-Info-Symbol 0x54320 ergibt ähnliche Ergebnisse. Siehe Abschnitt Infosymbol. C Betrachte als Ganzzahl und drucke sie als Zeichenkonstante. F Betrachten Sie die Bits des Wertes als Gleitkommazahl und drucken Sie mit der typischen Gleitkommasyntax. Zum Beispiel, um den Programmzähler in Hex zu drucken (siehe Abschnitt 8.10 Register), geben Sie an, dass kein Leerzeichen benötigt wird, bevor der Schrägstrich dies ist, weil Befehlsnamen im GDB keinen Schrägstrich enthalten können. Um den letzten Wert in der Werthistorie mit einem anderen Format neu zu drucken, kannst du den Druckbefehl nur mit einem Format und ohne Ausdruck verwenden. Zum Beispiel, px druckt den letzten Wert in hex. GNU GDB Debugger Command Cheat Sheet Kompilieren Sie mit der Option - g (für die meisten GNU und Intel Compiler), die zusätzliche Informationen in den Objektcode generiert, so dass der Debugger kann eine Zeile mit Quellcode mit Der Schritt der Hinrichtung. Verwenden Sie keine Compiler-Optimierungsrichtlinie wie - O oder - O2, die Rechenoperationen neu anordnen, um Geschwindigkeit zu erlangen, da diese Neuordnung nicht mit der Reihenfolge der Ausführung im Quellcode übereinstimmt und es unmöglich ist, zu folgen. Controlc: Stoppen Sie die Ausführung. Es kann Programm überall aufhören, in deiner Quelle oder einer C-Bibliothek oder irgendwo. Zum Ausführen eines Shell-Befehls: Befehls - oder Shell-Befehl GDB-Befehlsabschluss: TAB-Schlüssel verwenden info bre TAB wird den Befehl ausfüllen, der zu Info-Haltepunkten führt. TAB zweimal drücken, um alle verfügbaren Optionen zu sehen, wenn mehr als eine Option verfügbar ist oder M-RETURN eingeben. GDB-Befehl Abkürzung: info bre RETURN arbeitet als bre ist eine gültige Abkürzung für Breakpoints De-Referenzierung STL Container: Anzeigen von STL Containerklassen mit dem GDB p Variablennamen ergibt eine kryptische Darstellung von Template-Definitionen und Pointern. Verwenden Sie Folgendes. Gdbinit-Datei (V1.03 091508). Jetzt arbeitet mit GDB 4.3. (Archivierte Versionen: V1.01 GDB 6.4 nur) Danke an Dr. Eng. Dan C. Marinescu für die Erlaubnis, dieses Skript zu veröffentlichen. Verwenden Sie die folgenden Befehle, die vom Skript bereitgestellt werden: 10.5 Ausgabeformate Standardmäßig druckt gdb einen Wert entsprechend seinem Datentyp aus. Manchmal ist das nicht das, was du willst. Beispielsweise möchten Sie vielleicht eine Zahl in Hexe oder einen Zeiger in Dezimalzahl drucken. Oder möchten Sie vielleicht Daten im Speicher an einer bestimmten Adresse als Zeichenfolge oder als Anweisung anzeigen. Um dies zu tun, geben Sie ein Ausgabeformat an, wenn Sie einen Wert drucken. Die einfachste Verwendung von Ausgabeformaten ist, wie man einen bereits berechneten Wert ausdruckt. Dies geschieht durch das Starten der Argumente des Druckbefehls mit einem Schrägstrich und einem Formatbuchstaben. Die unterstützten Formatbuchstaben sind: x Betrachten Sie die Bits des Wertes als Ganzzahl und drucken Sie die Ganzzahl in Hexadezimal. D Als Ganzzahl in signierter Dezimalzahl drucken. U Als Integer in unsigned dezimal drucken O Als Integer im Oktal drucken T Als Integer in binär drucken. Der Buchstabe lsquo t rsquo steht für ldquotwordquo. 1 a Drucken als Adresse, sowohl absolut in Hexadezimal als auch als Versatz aus dem nächstgelegenen Symbol. Sie können dieses Format verwenden, um zu entdecken, wo (in welcher Funktion) eine unbekannte Adresse gefunden wird: Das Befehls-Info-Symbol 0x54320 ergibt ähnliche Ergebnisse. Siehe Infosymbol. C Betrachte als Ganzzahl und drucke sie als Zeichenkonstante. Dies druckt sowohl den numerischen Wert als auch dessen Zeichendarstellung. Die Zeichendarstellung wird durch die Oktal-Flucht lsquo nnn rsquo für Zeichen außerhalb des 7-Bit-Ascii-Bereichs ersetzt. Ohne dieses Format zeigt gdb char. Unsigned char. Und signierte Char-Daten als Zeichen-Konstanten. Single-Byte-Member von Vektoren werden als Integer-Daten angezeigt. F Betrachten Sie die Bits des Wertes als Gleitkommazahl und drucken Sie mit der typischen Gleitkommasyntax. S Als Grenze, wenn möglich. Mit diesem Format werden Zeiger auf Single-Byte-Daten als nullterminierte Strings angezeigt und Arrays von Single-Byte-Daten werden als Strings mit fester Länge angezeigt. Andere Werte werden in ihren natürlichen Typen angezeigt. Ohne dieses Format zeigt gdb Zeiger auf und Arrays von char. Unsigned char. Und zeichnete als Zeichenfolgen. Single-Byte-Member eines Vektors werden als Integer-Array angezeigt. Z Wie lsquo x rsquo Formatierung wird der Wert als Ganzzahl behandelt und als hexadezimal gedruckt, aber führende Nullen werden gedruckt, um den Wert auf die Größe des Integer-Typs zu setzen. R Drucken Sie mit dem lsquo rohen rsquo Formatierung. Standardmäßig verwendet gdb einen Python-basierten ziemlich-Drucker, falls einer verfügbar ist (siehe Pretty Printing). Dies führt typischerweise zu einer übergeordneten Anzeige der Werteinhalte. Das lsquo r rsquo Format umgeht jeden Python ziemlich-Drucker, der existieren könnte. Zum Beispiel, um den Programmzähler in Hex zu drucken (siehe Register), geben Sie an, dass kein Leerzeichen benötigt wird, bevor der Schrägstrich dies ist, weil Befehlsnamen in gdb keinen Schrägstrich enthalten können. Um den letzten Wert in der Werthistorie mit einem anderen Format neu zu drucken, kannst du den Druckbefehl nur mit einem Format und ohne Ausdruck verwenden. Zum Beispiel, lsquo px rsquo druckt den letzten Wert in hex. 1 lsquo b rsquo kann nicht verwendet werden, weil diese Formatbuchstaben auch mit dem Befehl x verwendet werden, wo lsquo b rsquo steht für ldquobyterdquo siehe Untersuchen des Gedächtnisses .8. Daten untersuchen Der übliche Weg, um Daten in Ihrem Programm zu untersuchen, ist mit dem Druckbefehl (abgekürzt p) oder dessen Synonym zu prüfen. Es wertet und druckt den Wert eines Ausdrucks der Sprache, in der Ihr Programm geschrieben wird (siehe Abschnitt GDB mit verschiedenen Sprachen verwenden). Print expr print f expr expr ist ein Ausdruck (in der Ausgangssprache). Standardmäßig wird der Wert von expr in einem Format gedruckt, das seinem Datentyp entspricht, den Sie ein anderes Format auswählen können, indem Sie f angeben. Wobei f ein Buchstabe ist, der das Format angibt, siehe Ausgabeformate. Print print f Wenn Sie expr. GDB zeigt den letzten Wert wieder an (aus der Werthistorie siehe Abschnitt Wertverlauf). Damit können Sie den gleichen Wert in einem alternativen Format bequem einsehen. Eine niedrigere Ebene der Prüfung der Daten ist mit dem Befehl x. Es untersucht Daten im Speicher an einer bestimmten Adresse und druckt sie in einem bestimmten Format. Siehe Abschnitt Gedächtnis untersuchen. Wenn Sie sich für Informationen über Typen interessieren oder darüber, wie die Felder einer Struktur oder einer Klasse deklariert sind, verwenden Sie den Befehl ptype exp, anstatt zu drucken. Siehe Abschnitt Untersuchen der Symboltabelle. 8.1 Ausdrücke drucken und viele andere GDB-Befehle akzeptieren einen Ausdruck und berechnen seinen Wert. Jede Art von Konstante, Variable oder Bediener, die durch die Programmiersprache definiert ist, die Sie verwenden, ist in einem Ausdruck in GDB gültig. Dazu gehören bedingte Ausdrücke, Funktionsaufrufe, Casts und String-Konstanten. Es enthält leider keine Symbole, die durch Präprozessor definiert werden. GDB unterstützt Array-Konstanten in Ausdrücken, die vom Benutzer eingegeben werden. Die Syntax ist. . Zum Beispiel können Sie den Befehl print verwenden, um ein Array im Speicher aufzubauen, das im Zielprogramm malloc ed ist. Da C so weit verbreitet ist, sind die meisten Ausdrücke, die in den Beispielen in diesem Handbuch gezeigt werden, in C. Siehe Abschnitt Verwenden von GDB mit verschiedenen Sprachen. Informationen über die Verwendung von Ausdrücken in anderen Sprachen. In diesem Abschnitt besprechen wir Operatoren, die Sie in GDB-Ausdrücken verwenden können, unabhängig von Ihrer Programmiersprache. Casts werden in allen Sprachen unterstützt, nicht nur in C, weil es so nützlich ist, eine Zahl in einen Zeiger zu werfen, um eine Struktur an dieser Adresse im Speicher zu untersuchen. GDB unterstützt diese Operatoren, zusätzlich zu den üblichen Programmiersprachen: ist ein binärer Operator für die Behandlung von Teilen des Speichers als Arrays. Siehe Abschnitt Künstliche Arrays. für mehr Informationen. :: ermöglicht es Ihnen, eine Variable in Bezug auf die Datei oder Funktion, wo es definiert ist, anzugeben. Siehe Abschnitt Programmvariablen. Addr Bezieht sich auf ein Objekt vom Typ Typ, das bei der Adresse addr im Speicher gespeichert ist. Addr kann ein beliebiger Ausdruck sein, dessen Wert eine Ganzzahl oder ein Zeiger ist (aber Klammern sind um Binäroperatoren erforderlich, genau wie in einer Besetzung). Dieses Konstrukt ist erlaubt, unabhängig davon, welche Art von Daten normalerweise in addr liegen soll. 8.2 Programmvariablen Die häufigste Art des Ausdrucks ist der Name einer Variablen in deinem Programm. Variablen in Ausdrücken werden im ausgewählten Stapelrahmen verstanden (siehe Abschnitt Auswählen eines Rahmens) müssen sie entweder: global (oder datei-statisch) sichtbar nach den Regeln der Programmiersprache ab dem Zeitpunkt der Ausführung in diesem Rahmen Dies bedeutet, dass In der Funktion kannst du die Variable a betrachten und verwenden, wann immer dein Programm innerhalb der Funktion foo ausgeführt wird. Aber du kannst die Variable b nur verwenden oder untersuchen, während dein Programm in dem Block ausgeführt wird, in dem b deklariert ist. Es gibt eine Ausnahme: Sie können sich auf eine Variable oder eine Funktion beziehen, deren Umfang eine einzelne Quelldatei ist, auch wenn der aktuelle Ausführungspunkt nicht in dieser Datei ist. Aber es ist möglich, mehr als eine solche Variable oder Funktion mit dem gleichen Namen (in verschiedenen Quelldateien) zu haben. Wenn das passiert, hat die Bezugnahme auf diesen Namen unvorhersehbare Effekte. Wenn Sie möchten, können Sie eine statische Variable in einer bestimmten Funktion oder Datei angeben, indem Sie die Colon-Colon-Notation verwenden: Hier ist Datei oder Funktion der Name des Kontextes für die statische Variable. Im Falle von Dateinamen können Sie Anführungszeichen verwenden, um sicherzustellen, dass GDB den Dateinamen als Einzelwort analysiert - zum Beispiel, um einen globalen Wert von x zu drucken, der in f2.c definiert ist. Diese Verwendung von :: ist sehr selten im Konflikt mit der sehr ähnlichen Verwendung der gleichen Notation in C. GDB unterstützt auch die Verwendung des C-Geltungsbereichs in GDB-Ausdrücken. Warnung: Gelegentlich kann eine lokale Variable an bestimmten Punkten in einer Funktion den falschen Wert haben - kurz nach dem Einstieg in einen neuen Bereich und kurz vor dem Beenden. Sie können dieses Problem sehen, wenn Sie durch Maschinenanweisungen treten. Dies liegt daran, dass bei den meisten Maschinen mehr als eine Anweisung zum Einrichten eines Stapelrahmens (einschließlich lokaler Variablendefinitionen) erforderlich ist, wenn Sie durch Maschinenbefehle schreiten, können Variablen die falschen Werte aufweisen, bis der Stapelrahmen vollständig gebaut ist. Beim Ausstieg dauert es in der Regel auch mehr als eine Maschinenanweisung, um einen Stapelrahmen zu zerstören, nachdem du damit begonnen hast, durch diese Gruppe von Anweisungen zu gehen, lokale Variablendefinitionen können weg sein. Dies kann auch passieren, wenn der Compiler erhebliche Optimierungen macht. Um sicher zu sein, dass Sie immer genaue Werte sehen, schalten Sie alle Optimierungen beim Kompilieren aus. Ein weiterer möglicher Effekt von Compiler-Optimierungen besteht darin, unbenutzte Variablen aus der Existenz zu optimieren oder Variablen zu Registern zuzuordnen (im Gegensatz zu Speicheradressen). Abhängig von der Unterstützung für solche Fälle, die durch das vom Compiler verwendete Debug-Info-Format angeboten werden, ist GDB möglicherweise nicht in der Lage, Werte für solche lokalen Variablen anzuzeigen. Wenn das passiert, wird GDB eine Nachricht wie folgt ausdrucken: Um solche Probleme zu lösen, entweder ohne Optimierungen neu zu kompilieren oder ein anderes Debug-Info-Format zu verwenden, wenn der Compiler mehrere solcher Formate unterstützt. Zum Beispiel, GCC, der GNU CC-Compiler unterstützt in der Regel die Option - gstabs. - gstabs erzeugt Debug-Informationen in einem Format, das Formaten wie COFF überlegen ist. Sie können DWARF2 (-gdwarf-2) verwenden, was auch eine effektive Form für Debug-Info ist. Siehe Abschnitt Optionen für das Debuggen Ihres Programms oder GNU CC unter Verwendung von GNU CC. für mehr Informationen. Der linke Operand des Musses muss sich im Speicher befinden. Array-Werte, die auf diese Weise gemacht werden, verhalten sich wie andere Arrays in Bezug auf das Subskription und werden zu Zeigern gezwungen, wenn sie in Ausdrücken verwendet werden. Künstliche Arrays erscheinen am häufigsten in Ausdrücken über die Werthistorie (siehe Abschnitt Werthistorie), nach dem Ausdrucken eines aus. Ein weiterer Weg, um eine künstliche Array zu schaffen ist, eine Besetzung zu verwenden. Dies interpretiert einen Wert, als ob es ein Array wäre. Der Wert muss nicht im Speicher sein: Als Bequemlichkeit, wenn du die Array-Länge verlässt (wie in (type) value) GDB berechnet die Größe, um den Wert zu füllen (als sizeof (value) sizeof (type) Manchmal ist das künstliche Array Mechanismus ist bei mäßig komplexen Datenstrukturen nicht ganz ausreichend, die interessierenden Elemente sind vielleicht nicht angrenzend - zum Beispiel, wenn man sich für die Werte von Zeigern in einem Array interessiert. Eine nützliche Arbeit in dieser Situation ist die Verwendung eines Bequemlichkeitsvariable (siehe Abschnitt Convenience-Variablen) als Zähler in einem Ausdruck, der den ersten interessanten Wert druckt und diesen Ausdruck dann über RET wiederholt. Angenommen, du hast ein Array dtab von Zeigern zu Strukturen, und du interessierst dich für die Werte Von einem Feld fv in jeder Struktur Hier ist ein Beispiel für das, was Sie eingeben könnten: 8.4 Ausgabeformate Standardmäßig druckt GDB einen Wert nach seinem Datentyp, manchmal ist dies nicht das, was Sie wollen, zum Beispiel möchten Sie vielleicht drucken Eine Zahl in Hexe oder ein Zeiger in Dezimalzahl. Oder möchten Sie vielleicht Daten im Speicher an einer bestimmten Adresse als Zeichenfolge oder als Anweisung anzeigen. Um dies zu tun, geben Sie ein Ausgabeformat an, wenn Sie einen Wert drucken. Die einfachste Verwendung von Ausgabeformaten ist, wie man einen bereits berechneten Wert ausdruckt. Dies geschieht durch das Starten der Argumente des Druckbefehls mit einem Schrägstrich und einem Formatbuchstaben. Die unterstützten Formatbuchstaben sind: x Betrachten Sie die Bits des Wertes als Ganzzahl und drucken Sie die Ganzzahl in Hexadezimal. D Als Ganzzahl in signierter Dezimalzahl drucken. U Als Integer in unsigned dezimal drucken O Als Integer im Oktal drucken T Als Integer in binär drucken. Der Buchstabe t steht für zwei. (2) a Druck als Adresse, sowohl absolut in hexadezimal als auch als Versatz aus dem nächstgelegenen Symbol. Sie können dieses Format verwenden, um zu entdecken, wo (in welcher Funktion) eine unbekannte Adresse gefunden wird: Das Befehls-Info-Symbol 0x54320 ergibt ähnliche Ergebnisse. Siehe Abschnitt Infosymbol. C Betrachte als Ganzzahl und drucke sie als Zeichenkonstante. F Betrachten Sie die Bits des Wertes als Gleitkommazahl und drucken Sie mit der typischen Gleitkommasyntax. Zum Beispiel, um den Programmzähler in Hex zu drucken (siehe Abschnitt 8.10 Register), geben Sie an, dass kein Leerzeichen benötigt wird, bevor der Schrägstrich dies ist, weil Befehlsnamen im GDB keinen Schrägstrich enthalten können. Um den letzten Wert in der Werthistorie mit einem anderen Format neu zu drucken, kannst du den Druckbefehl nur mit einem Format und ohne Ausdruck verwenden. Zum Beispiel druckt px den letzten Wert in Hex. 8.5 Gedächtnis prüfen Sie können den Befehl x (zur Prüfung) verwenden, um den Speicher in einem beliebigen Format zu prüfen, unabhängig von Ihren Programmdatentypen. X nfu addr x addr x Verwenden Sie den Befehl x, um den Speicher zu untersuchen. N. F. Und du bist alle optionalen Parameter, die angeben, wie viel Speicher zu zeigen und wie es zu formatieren addr ist ein Ausdruck geben die Adresse, wo Sie starten wollen, Speicher anzuzeigen. Wenn Sie standardmäßig für nfu verwenden. Sie müssen den Schrägstrich nicht eingeben. Mehrere Befehle setzen bequeme Vorgaben für addr. N. Die Wiederholungszählung Die Wiederholungszählung ist eine Dezimalzahl, die in der Voreinstellung 1 steht. Sie gibt an, wie viel Speicher (Zählen von Einheiten u) angezeigt werden soll. F. Das Anzeigeformat Das Anzeigeformat ist eines der Formate, die vom Druck verwendet werden. S (nullterminierte Zeichenfolge) oder i (Maschinenanweisung). Die Voreinstellung ist zunächst x (hexadezimal). Die Voreinstellung ändert sich jedes Mal, wenn Sie entweder x oder drucken. Du bist Die Einheitsgröße Die Einheitsgröße ist eine von b Bytes. H Halfwords (zwei Bytes). W Wörter (vier Bytes). Dies ist die ursprüngliche Voreinstellung. G riesige Worte (acht Bytes). Jedes Mal, wenn Sie eine Einheitsgröße mit x angeben. Diese Größe wird die Standardeinheit, wenn Sie das nächste Mal x verwenden. (Für die s - und i-Formate wird die Einheitsgröße ignoriert und ist normalerweise nicht geschrieben.) Addr. Startanzeigeadresse addr ist die Adresse, wo GDB beginnen soll, Speicher anzuzeigen. Der Ausdruck braucht keinen Zeigerwert zu haben (obwohl er es kann), wird er immer als eine ganzzahlige Adresse eines Bytes des Gedächtnisses interpretiert. Siehe Abschnitt Ausdrücke. Für weitere Informationen über Ausdrücke. Die Voreinstellung für addr ist in der Regel erst nach der letzten eingehenden Adresse - aber einige andere Befehle setzen auch die Standardadresse: Info-Haltepunkte (zur Adresse des letzten Haltepunkts), Infozeile (zur Startadresse einer Zeile) und Drucken (wenn Sie es verwenden, um einen Wert aus dem Speicher anzuzeigen). Zum Beispiel ist x3uh 0x54320 eine Anforderung, drei Halbwörter (h) des Speichers anzuzeigen, die als unsigned decimal integers (u) formatiert sind, beginnend bei Adresse 0x54320. X4xw sp druckt die vier Wörter (w) des Speichers über dem Stack-Pointer (hier, siehe Abschnitt Registers) in hexadezimal (x). Da die Buchstaben, die Einheitengrößen angeben, sich alle von den Buchstaben unterscheiden, die Ausgabeformate angeben, müssen Sie sich nicht erinnern, ob die Einheitsgröße oder das Format zuerst anfängt. Die Ausgangsspezifikationen 4xw und 4wx bedeuten genau dasselbe. (Allerdings muss der Zählwert n zuerst kommen, wenn man nicht funktioniert.) Obwohl die Einheitsgröße u für die Formate s und i ignoriert wird. Du möchtest vielleicht noch einen Zählwert n verwenden, 3i gibt an, dass du drei Maschinenbefehle, einschließlich aller Operanden, sehen möchtest. Der Befehl zerlegt eine alternative Möglichkeit, Maschineninstruktionen zu überprüfen, siehe Quell - und Maschinencode. Alle Vorgaben für die Argumente zu x sind so konzipiert, dass es einfach ist, den Scan-Speicher mit minimalen Spezifikationen fortzusetzen, jedes Mal wenn Sie x verwenden. Zum Beispiel, nachdem Sie drei Maschinenanweisungen mit x3i addr geprüft haben. Du kannst die nächsten sieben mit nur x7 inspizieren. Wenn Sie RET verwenden, um den Befehl x zu wiederholen, wird die Wiederholungszählung n wieder verwendet, wobei die anderen Argumente für die sukzessiven Verwendung von x standardmäßig verwendet werden. Die Adressen und Inhalte, die durch den Befehl x gedruckt werden, werden nicht in der Werthistorie gespeichert, da es oft zu viel von ihnen gibt und sie in den Weg kommen würden. Stattdessen stellt die GDB diese Werte für die spätere Verwendung in Ausdrücken als Werte der Bequemlichkeitsvariablen zur Verfügung. Nach einem x-Befehl steht die letzte geprüfte Adresse zur Verwendung in Ausdrücken in der Bequemlichkeitsvariable zur Verfügung. Der Inhalt dieser Adresse, wie geprüft, ist in der Bequemlichkeitsvariable verfügbar. Wenn der x-Befehl eine Wiederholungszählung hat, werden die gespeicherten Adressen und Inhalte aus der letzten Speichereinheit gedruckt, die nicht mit der letzten Adresse übereinstimmt, die gedruckt wurde, wenn mehrere Einheiten auf der letzten Ausgabezeile gedruckt wurden. 8.6 Automatische Anzeige Wenn Sie feststellen, dass Sie den Wert eines Ausdrucks häufig drucken möchten (um zu sehen, wie er sich ändert), möchten Sie ihn ggf. der automatischen Anzeigeliste hinzufügen, damit GDB bei jedem Programmstart seinen Wert ausdruckt. Jeder Ausdruck, der der Liste hinzugefügt wird, erhält eine Zahl, um sie zu identifizieren, um einen Ausdruck aus der Liste zu entfernen, Sie geben diese Nummer an. Die automatische Anzeige sieht wie folgt aus: Diese Anzeige zeigt Artikelnummern, Ausdrücke und deren aktuelle Werte an. Wie bei Displays manuell manuell mit x oder drucken. Sie können das Ausgabeformat angeben, das Sie in der Tat bevorzugen, die Anzeige entscheidet, ob Sie print oder x verwenden, je nachdem, wie Sie Ihre Formatspezifikation ausarbeiten - es verwendet x, wenn Sie eine Einheitsgröße oder eines der beiden Formate (i und s) Die nur von x unterstützt werden. Display expr Fügen Sie den Ausdruck expr zur Liste der Ausdrücke hinzu, um anzuzeigen, jedes Mal, wenn Ihr Programm stoppt. Siehe Abschnitt Ausdrücke. Die Anzeige wird nicht wiederholt, wenn Sie nach dem Gebrauch erneut RET drücken. Display fmt expr Für fmt, das nur ein Anzeigeformat angibt und nicht eine Größe oder Anzahl, fügen Sie den Ausdruck expr zur Auto-Display-Liste hinzu, aber ordnen Sie es jedes Mal im angegebenen Format fmt anzuzeigen. Siehe Abschnitt Ausgabeformate. Display fmt addr Für fmt i oder s. Oder mit einer Einheitsgröße oder einer Anzahl von Einheiten, fügen Sie den Ausdruck addr als Speicheradresse hinzu, die bei jedem Programmstart untersucht werden soll. Untersuchen bedeutet in der Tat x fmt addr. Siehe Abschnitt Gedächtnis untersuchen. Zum Beispiel kann displayi pc hilfreich sein, um zu sehen, wie die Maschinenanweisung bei jeder Ausführung ausgeführt wird (pc ist ein gemeinsamer Name für den Programmzähler siehe Abschnitt Register). Unauffällige dnums Löschen dnums löschen Entfernen Sie die Artikelnummern aus der Liste der Ausdrücke, die angezeigt werden sollen. Andisplay nicht wiederholen, wenn Sie RET nach der Verwendung drücken. (Andernfalls bekommst du nur den Fehler Keine Displaynummer.) Deaktivieren Sie Displaydnums. Deaktivieren Sie die Anzeige der Artikelnummern. Ein deaktiviertes Display wird nicht automatisch gedruckt, ist aber nicht vergessen. Es kann später wieder aktiviert werden. Aktivieren Sie Displays. Aktivieren Sie die Anzeige der Artikelnummern. Es wird wieder einmal in der automatischen Anzeige seines Ausdrucks wirksam, bis Sie etwas anderes angeben. Display Zeigen Sie die aktuellen Werte der Ausdrücke in der Liste an, genau wie bei Ihrem Programm. Info-Anzeige Drucken Sie die Liste der zuvor eingestellten Ausdrücke, die jeweils mit ihrer Artikelnummer angezeigt werden, aber ohne die Werte anzuzeigen. Dazu gehören behinderte Ausdrücke, die als solche gekennzeichnet sind. Es enthält auch Ausdrücke, die momentan nicht angezeigt werden, weil sie sich auf automatische Variablen beziehen, die derzeit nicht verfügbar sind. Wenn ein Anzeigeausdruck auf lokale Variablen verweist, dann ist es nicht sinnvoll, außerhalb des lexikalischen Kontexts, für den es eingerichtet wurde. Ein solcher Ausdruck ist deaktiviert, wenn die Ausführung in einen Kontext eintritt, in dem eine ihrer Variablen nicht definiert ist. Zum Beispiel, wenn Sie die Befehlsanzeige lastchar während innerhalb einer Funktion mit einem Argument lastchar geben. GDB zeigt dieses Argument an, während Ihr Programm weiterhin in dieser Funktion aufhört. Wenn es anderswo anhält - wo es keine Variable Lastchar gibt - wird die Anzeige automatisch deaktiviert. Das nächste Mal, wenn dein Programm aufhört, wo lastchar aussagekräftig ist, kannst du den Display-Ausdruck noch einmal aktivieren. Sie können die eingestellte Druckadresse ausschalten, um alle maschinenabhängigen Anzeigen aus der GDB-Schnittstelle zu eliminieren. Zum Beispiel mit der Druckadresse aus. Sie sollten den gleichen Text für Backtraces auf allen Maschinen erhalten - egal, ob es sich um Zeiger-Argumente handelt. Druckadresse anzeigen Zeigen, ob Adressen gedruckt werden sollen oder nicht. Wenn GDB eine symbolische Adresse druckt, druckt es normalerweise das nächstliegende Symbol plus einen Offset. Wenn dieses Symbol die Adresse nicht eindeutig identifiziert (zB ein Name, dessen Umfang eine einzelne Quelldatei ist), müssen Sie eventuell klären. Ein Weg, dies zu tun ist mit Info-Zeile. Zum Beispiel info line 0x4537. Alternativ können Sie GDB einstellen, um die Quelldatei und die Zeilennummer zu drucken, wenn sie eine symbolische Adresse ausdruckt: setzen Sie den Drucksymbol-Dateinamen auf Sagen Sie GDB, um den Quelldateinamen und die Zeilennummer eines Symbols in der symbolischen Form einer Adresse zu drucken. Setzen Sie den Drucksymbol-Dateinamen aus. Drucken Sie nicht den Quelldateinamen und die Zeilennummer eines Symbols aus. Dies ist die Voreinstellung. Show print symbol-filename Zeigen Sie an, ob GDB den Quelldateinamen und die Zeilennummer eines Symbols in der symbolischen Form einer Adresse ausdruckt. Eine andere Situation, wo es hilfreich ist, Symbol-Dateinamen und Zeilennummern anzuzeigen, ist beim Zerlegen von Code GDB zeigt Ihnen die Zeilennummer und Quelldatei, die jeder Anweisung entspricht. Außerdem können Sie die symbolische Form nur sehen, wenn die zu druckende Adresse in der Nähe des nächstgelegenen früheren Symbols liegt: set print max-symbolisch-offset max-offset Sagen Sie GDB, um nur die symbolische Form einer Adresse anzuzeigen, wenn der Versatz zwischen Das nächstliegende Symbol und die Adresse ist kleiner als max-offset. Die Voreinstellung ist 0, die GDB anweist, immer die symbolische Form einer Adresse zu drucken, wenn ein Symbol vorangeht. Show print max-symbolic-offset Fragen Sie, wie groß der maximale Versatz ist, dass GDB in einer symbolischen Adresse druckt. Wenn du einen Zeiger hast und du nicht sicher bist, wo es punktiert, versuchst du den Drucksymbol-Dateinamen ein. Dann können Sie den Namen und die Quelldatei Speicherort der Variablen, wo es Punkte, mit pa Zeiger zu bestimmen. Dies interpretiert die Adresse in symbolischer Form. Zum Beispiel zeigt hier GDB, dass eine Variable ptt auf eine andere Variable t zeigt. Definiert in hi2.c. Warnung: Bei Zeigern, die auf eine lokale Variable verweisen, zeigt pa nicht den Symbolnamen und den Dateinamen des Referenten an, auch wenn die entsprechenden Druckoptionen aktiviert sind. Andere Einstellungen steuern, wie verschiedene Arten von Objekten gedruckt werden: set print array set print array auf Pretty print arrays. Dieses Format ist bequemer zu lesen, aber verwendet mehr Platz. Der Standardwert ist deaktiviert. Setze das Array aus. Zurück zum komprimierten Format für Arrays. Show print array Zeigen Sie, ob komprimiertes oder hübsches Format für die Anzeige von Arrays ausgewählt ist. Set print elements number-of-elements Legt fest, wie viele Elemente eines Array-GDB drucken werden. Wenn GDB ein großes Array druckt, stoppt es den Druckvorgang, nachdem er die Anzahl der Elemente gedruckt hat, die durch den Befehl set print elements gesetzt wurden. Diese Grenze gilt auch für die Anzeige von Saiten. Wenn GDB startet, wird diese Grenze auf 200 gesetzt. Die Einstellung der Anzahl der Elemente auf Null bedeutet, dass der Druck unbegrenzt ist. Show print elements Zeigt die Anzahl der Elemente eines großen Arrays an, die GDB drucken wird. Wenn die Nummer 0 ist, ist das Drucken unbegrenzt. Set print null-stop Ursache GDB, um das Drucken der Zeichen eines Arrays zu stoppen, wenn das erste NULL angetroffen wird. Dies ist sinnvoll, wenn große Arrays tatsächlich nur kurze Strings enthalten. Der Standardwert ist deaktiviert. Setzen Sie den Druck ziemlich auf Ursache GDB, um Strukturen in einem eingekerbten Format mit einem Mitglied pro Zeile zu drucken, wie folgt: setzen Sie den Druck ziemlich aus. Ursache GDB, um Strukturen in einem kompakten Format zu drucken, wie dies: Dies ist das Standardformat. Show print pretty Zeigen Sie, welches Format GDB verwendet, um Strukturen zu drucken. Setze siebenbit-Strings auf Print mit nur sieben-Bit-Zeichen, wenn diese Option gesetzt ist, GDB zeigt alle 8-Bit-Zeichen (in Strings oder Zeichen-Werte) mit der Notation nnn. Diese Einstellung ist am besten, wenn Sie in Englisch arbeiten (ASCII) und Sie verwenden das High-Order-Bit von Zeichen als Marker oder Meta-Bit. Set print sevenbit-strings aus Print full eight-bit Zeichen. Dies ermöglicht die Verwendung von mehr internationalen Zeichensätzen und ist der Standard. Show print sevenbit-strings Zeigen Sie, ob GDB nur sieben-Bit-Zeichen druckt oder nicht. Stelle Druckvereinigung auf Tell GDB, um Gewerkschaften zu drucken, die in den Strukturen enthalten sind. Dies ist die Standardeinstellung. Setzen Sie den Druckverband aus. Geben Sie GDB nicht an, um Gewerkschaften zu drucken, die in Strukturen enthalten sind. Show print union Fragen Sie GDB, ob es die Gewerkschaften drucken wird, die in den Strukturen enthalten sind. Zum Beispiel bei den Deklarationen Diese Einstellungen sind bei der Debugging von C-Programmen von Interesse: Setzen Sie das Druck-Demangle-Set-Druck-Demangle auf Print-C-Namen in ihrer Quellform und nicht in die codierte (mangled) Form, die an den Assembler und Linker für die typsichere Verknüpfung übergeben wurde . Die Voreinstellung ist aktiviert. Show print decangle Zeigen Sie, ob C-Namen in verstümmelter oder abgerundeter Form gedruckt werden. Setzen Sie print asm-demangle set print asm-demangle auf Print C-Namen in ihrer Quellform anstatt ihre mangled Form, auch in Assembler-Code-Ausdrucken wie Anleitung Disassemblies. Der Standardwert ist deaktiviert. Show print asm-demangle Zeigen Sie, ob C-Namen in Montagelisten in verstümmelter oder abgerundeter Form gedruckt sind. Set decangle-style style Wählen Sie aus mehreren Codierungsschemata, die von verschiedenen Compilern verwendet werden, um C-Namen darzustellen. Die Wahlmöglichkeiten für Stil sind derzeit: auto Erlaube GDB, einen Decodierungsstil zu wählen, indem du dein Programm kontrollierst. Gnu Decode basiert auf dem GNU C Compiler (g) Codierungsalgorithmus. Dies ist die Voreinstellung. Hp Decode basierend auf dem HP ANSI C (aCC) Kodierungsalgorithmus. Lucid Decode basierend auf dem Lucid C Compiler (lcc) Codierungsalgorithmus. Arm Decode mit dem Algorithmus im C Annotated Reference Manual. Warnung: Diese Einstellung allein reicht nicht aus, um das Debuggen von Cfront-generierten ausführbaren Dateien zu ermöglichen. GDB würde eine weitere Verbesserung erfordern, um das zu erlauben. Wenn du Stil weglest. Sie sehen eine Liste der möglichen Formate. Show demangle-style Zeigen Sie den aktuell verwendeten Codierungsstil für die Decodierung von C-Symbolen an. Setzen Sie das Druckobjekt-Set-Druckobjekt an Wenn Sie einen Zeiger auf ein Objekt anzeigen, markieren Sie den tatsächlichen (abgeleiteten) Typ des Objekts und nicht den deklarierten Typ mit der virtuellen Funktionstabelle. Druckobjekt ausschalten Nur den deklarierten Objekttyp anzeigen, ohne Bezug auf die virtuelle Funktionstabelle. Dies ist die Standardeinstellung. Show print object Zeigen Sie, ob aktuelle oder deklarierte Objekttypen angezeigt werden. Set print static-members set print static-members auf Print static members bei der Anzeige eines C-Objekts. Die Voreinstellung ist aktiviert. Set print static-members aus Keine statischen Mitglieder bei der Anzeige eines C-Objekts drucken. Show print static-members Zeigen Sie, ob C statische Mitglieder gedruckt sind oder nicht. Set print vtbl set print vtbl auf Pretty print C virtuelle Funktionstabellen. Der Standardwert ist deaktiviert. (Die vtbl-Befehle funktionieren nicht mit Programmen, die mit dem HP ANSI C-Compiler (aCC) kompiliert wurden.) Set print vtbl off Hübsche Druckschrift C virtuelle Funktionstabellen. Show print vtbl Zeigen Sie, ob C virtuelle Funktionstabellen ziemlich gedruckt sind oder nicht. 8.9 Convenience-Variablen GDB bietet Bequemlichkeitsvariablen, die Sie innerhalb des GDB nutzen können, um einen Wert zu halten und später darauf zu verweisen. Diese Variablen existieren vollständig innerhalb des GDB, sie sind nicht Teil Ihres Programms und die Einstellung einer Bequemlichkeitsvariable hat keinen direkten Einfluss auf die weitere Ausführung Ihres Programms. Deshalb kannst du sie frei nutzen. Convenience Variablen sind vorangestellt. Jeder Name, der vorangestellt wird, kann für eine Bequemlichkeitsvariable verwendet werden, es sei denn, er ist einer der vordefinierten maschinenspezifischen Registernamen (siehe Abschnitt Register). (Werteverlaufsreferenzen dagegen sind Zahlen vorangestellt, siehe Abschnitt Werthistorie.) Sie können einen Wert in einer Bequemlichkeitsvariable mit einem Zuweisungsausdruck speichern, so wie Sie eine Variable in Ihrem Programm setzen würden. Zum Beispiel: würde in foo den Wert speichern, der in dem Objekt enthalten ist, auf das objectptr zeigt. Mit einer Convenience-Variable zum ersten Mal schafft es, aber sein Wert ist ungültig, bis Sie einen neuen Wert zuweisen. Sie können den Wert jederzeit mit einer anderen Zuordnung ändern. Convenience-Variablen haben keine festen Typen. Sie können eine Bequemlichkeitsvariable jede Art von Wert, einschließlich Strukturen und Arrays, zuweisen, auch wenn diese Variable bereits einen Wert eines anderen Typs hat. Die Bequemlichkeitsvariable, wenn sie als Ausdruck verwendet wird, hat den Typ ihres aktuellen Wertes. Zeigen Bequemlichkeit Drucken Sie eine Liste der Bequemlichkeitsvariablen, die bisher verwendet wurden, und ihre Werte. Abgekürzte Show conv. Eine der Möglichkeiten, eine Bequemlichkeitsvariable zu verwenden, ist als Zähler inkrementiert oder ein Zeiger, der vorgerückt werden soll. Zum Beispiel, um ein Feld aus aufeinanderfolgenden Elementen eines Arrays von Strukturen zu drucken: Wiederholen Sie diesen Befehl, indem Sie RET eingeben. Einige Bequemlichkeitsvariablen werden automatisch von GDB erstellt und gegebene Werte, die wahrscheinlich nützlich sind. Die Variable wird automatisch durch den Befehl x auf die zuletzt geprüfte Adresse gesetzt (siehe Abschnitt Gedicht prüfen). Andere Befehle, die eine Standardadresse für x zu prüfen, auch auf diese Adresse setzen diese Befehle enthalten Info-Zeile und Info-Haltepunkt. Der Typ ist ungültig, außer wenn er durch den Befehl x gesetzt ist. In diesem Fall handelt es sich um einen Zeiger auf den Typ von. Die Variable wird automatisch durch den Befehl x auf den Wert gesetzt, der in der letzten untersuchten Adresse gefunden wurde. Sein Typ wird so gewählt, dass er dem Format entspricht, in dem die Daten gedruckt wurden. Exitcode Der Variable exitcode wird automatisch auf den Exit-Code gesetzt, wenn das zu debuggende Programm beendet wird. Bei HP-UX-Systemen sucht GDB nach einer Funktion oder einem Variablennamen, der mit einem Dollarzeichen beginnt, zuerst einen Benutzer oder einen Systemnamen, bevor er nach einer Bequemlichkeitsvariable sucht. 8.12 Speicherbereichsattribute Speicherbereichsattribute erlauben es Ihnen, eine spezielle Behandlung zu beschreiben, die von den Regionen Ihres Zielspeichers benötigt wird. GDB uses attributes to determine whether to allow certain types of memory accesses whether to use specific width accesses and whether to cache target memory. Defined memory regions can be individually enabled and disabled. When a memory region is disabled, GDB uses the default attributes when accessing memory in that region. Similarly, if no memory regions have been defined, GDB uses the default attributes when accessing all memory. When a memory region is defined, it is given a number to identify it to enable, disable, or remove a memory region, you specify that number. mem address1 address2 attributes . Define memory region bounded by address1 and address2 with attributes attributes . . delete mem nums . Remove memory regions nums . . disable mem nums . Disable memory regions nums . . A disabled memory region is not forgotten. It may be enabled again later. enable mem nums . Enable memory regions nums . . info mem Print a table of all defined memory regions, with the following columns for each region. Memory Region Number Enabled or Disabled. Enabled memory regions are marked with y. Disabled memory regions are marked with n. Lo Address The address defining the inclusive lower bound of the memory region. Hi Address The address defining the exclusive upper bound of the memory region. Attributes The list of attributes set for this memory region. 8.13 Copy between memory and a file The commands dump. append. and restore are used for copying data between target memory and a file. Data is written into a file using dump or append. and restored from a file into memory by using restore. Files may be binary, srec, intel hex, or tekhex (but only binary files can be appended). dump binary memory filename startaddr endaddr Dump contents of memory from startaddr to endaddr into raw binary format file filename. append binary memory filename startaddr endaddr Append contents of memory from startaddr to endaddr to raw binary format file filename. dump binary value filename expression Dump value of expression into raw binary format file filename. append binary memory filename expression Append value of expression to raw binary format file filename. dump ihex memory filename startaddr endaddr Dump contents of memory from startaddr to endaddr into intel hex format file filename. dump ihex value filename expression Dump value of expression into intel hex format file filename. dump srec memory filename startaddr endaddr Dump contents of memory from startaddr to endaddr into srec format file filename. dump srec value filename expression Dump value of expression into srec format file filename. dump tekhex memory filename startaddr endaddr Dump contents of memory from startaddr to endaddr into tekhex format file filename. dump tekhex value filename expression Dump value of expression into tekhex format file filename. restore filename binary bias start end Restore the contents of file filename into memory. The restore command can automatically recognize any known bfd file format, except for raw binary. To restore a raw binary file you must use the optional argument binary after the filename. If bias is non-zero, its value will be added to the addresses contained in the file. Binary files always start at address zero, so they will be restored at address bias. Other bfd files have a built-in location they will be restored at offset bias from that location. If start andor end are non-zero, then only data between file offset start and file offset end will be restored. These offsets are relative to the addresses in the file, before the bias argument is applied.
No comments:
Post a Comment