Dbx-Debugprogramm verwenden

Dieser Bereich enthält Informationen zur Verwendung des Debugprogramms dbx .

dbx-Debugprogramm starten

Das Programm dbx kann mit verschiedenen Flags gestartet werden. Die drei gängigsten Methoden zum Starten einer Debugsitzung mit dem Programm dbx sind:

  • Befehl dbx für eine angegebene Objektdatei ausführen
  • Flag -r verwenden, um den Befehl dbx für ein Programm auszuführen, das abnormal beendet wird
  • Mit dem Flag -a den Befehl dbx für einen Prozess ausführen, der bereits in Bearbeitung ist

Wenn der Befehl dbx gestartet wird, sucht er im aktuellen Verzeichnis des Benutzers und im Verzeichnis $HOME nach einer .dbxinit -Datei. Wenn eine Datei .dbxinit vorhanden ist, werden ihre Unterbefehle zu Beginn der Debugsitzung ausgeführt. Wenn eine Datei .dbxinit im Ausgangsverzeichnis und im aktuellen Verzeichnis vorhanden ist, werden beide in dieser Reihenfolge gelesen. Da das aktuelle Verzeichnis .dbxinit zuletzt gelesen wird, können seine Unterbefehle die im Ausgangsverzeichnis überlagern.

Wenn keine Objektdatei angegeben wird, fordert das dbx -Programm den Namen der zu prüfenden Objektdatei an. Der Standardwert ist a.out. Wenn die Kerndatei im aktuellen Verzeichnis vorhanden ist oder ein Parameter CoreFile angegeben ist, meldet das dbx -Programm die Position, an der das Programm fehlerhaft ist. Variablen, Register und Speicher im Kernimage können untersucht werden, bis die Ausführung der Objektdatei beginnt. An diesem Punkt fordert das Debugprogramm dbx Befehle an.

Kernimage mit fehlenden abhängigen Modulen debuggen

Seit AIX® 5.3 ist das Programm ' dbx in der Lage, ein Core-Image auch dann zu untersuchen, wenn auf ein oder mehrere abhängige Module kein Zugriff möglich ist. Während der Initialisierung werden Benachrichtigungen für jedes fehlende abhängige Modul angezeigt.

Im normalen Betrieb stützt sich das dbx -Programm auf die Informationen in den Symboltabellen und Textabschnitten der abhängigen Module. Da einige dieser Informationen fehlen, hat eine dbx -Sitzung mit fehlenden abhängigen Modulen die folgenden Einschränkungen:
  • Alle Versuche des Benutzers, den Inhalt des Speichers in den Textabschnitten der fehlenden abhängigen Module zu lesen, führen zu einer Fehlernachricht. Die Fehlernachricht ähnelt dem Fehler, der auftritt, wenn auf Daten nicht zugegriffen werden kann, weil sie sich nicht in der Kerndatei befinden.
  • Der Benutzer kann keine Informationen zu Symbolen abrufen, die aus den Symboltabellen der fehlenden abhängigen Module gelesen wurden. Das Verhalten des Programms dbx ähnelt dem Fall, in dem die Symboltabelle eines abhängigen Moduls entfernt wurde.
  • Stack-Frames entsprechend Routinen in den fehlenden abhängigen Modulen werden einfach wie folgt angezeigt:
    .()
    Außerdem werden die Instruktionsadresse innerhalb der unbekannten Routine und der Name des entsprechenden fehlenden abhängigen Moduls angezeigt.

Der Benutzer hat immer die Möglichkeit, das Programm dbx mit dem Flag -p an zugängliche abhängige Module weiterzuleiten.

Kernimage mit abweichenden abhängigen Modulen debuggen

Ab AIX 5.3erkennt das dbx -Programm, ob sich abhängige Module, auf die in der Kerndatei verwiesen wird, von denen bei der Erstellung der Kerndatei unterscheiden. Während der Initialisierung werden Benachrichtigungen für jedes abweichende abhängige Modul angezeigt.

Der Benutzer sollte sich bewusst sein, dass alle Informationen, die vom dbx -Programm angezeigt werden und auf dem Inhalt eines abweichenden abhängigen Moduls basieren, möglicherweise nicht zuverlässig sind. Um den Benutzer auf Informationen hinzuweisen, die nicht vertrauenswürdig sind, sendet das Programm dbx Benachrichtigungen, sobald fragwürdige Informationen angezeigt werden.

Um diese Funktion zu inaktivieren und das Programm dbx zu zwingen, nicht übereinstimmende abhängige Module als fehlende abhängige Module zu behandeln, kann der Benutzer die Umgebungsvariable DBX_MISMATCH_MODULE mit dem Wert DISCARD exportieren. Wenn diese Variable exportiert wird, benachrichtigt das dbx -Programm den Benutzer weiterhin über die Abweichung, fährt jedoch so fort, als wären nicht übereinstimmende abhängige Module nicht zugänglich.

Der Benutzer hat immer die Möglichkeit, das dbx -Programm mit dem Flag -p an übereinstimmende abhängige Module weiterzuleiten.

Shellbefehle über dbx ausführen

Mit dem Unterbefehl sh können Sie Shellbefehle ausführen, ohne das Debugprogramm zu verlassen.

Wenn sh ohne Angabe von Befehlen eingegeben wird, wird die Shell zur Verwendung eingegeben, bis sie beendet wird. Dann wird die Steuerung an das dbx -Programm zurückgegeben.

Befehlszeileneditierung in dbx

Der Befehl dbx stellt Befehlszeileneditierfunktionen bereit, die denen der Korn-Shellähneln. Der Modus vi stellt vi-ähnliche Bearbeitungsfunktionen bereit, während der Modus emacs ähnliche Steuerelemente wie emacsbietet.

Sie können diese Funktionen mit dem dbx-Unterbefehl set -o oder set edit einschalten. Wenn Sie also die Befehlszeileneditierung im vi-Stil aktivieren möchten, geben Sie den Unterbefehl ein.set edit vioderset -o vi.

Sie können zum Festlegen des Bearbeitungsmodus auch die Umgebungsvariable EDITOR verwenden.

Der Befehl dbx speichert die eingegebenen Befehle in der Protokolldatei .dbxhistory. Wenn die Umgebungsvariable DBXHISTFILE nicht gesetzt ist, wird die Protokolldatei $HOME/.dbxhistoryverwendet.

Standardmäßig speichert der Befehl dbx den Text der letzten 128 eingegebenen Befehle. Dieser Grenzwert kann mit der Umgebungsvariablen DBXHISTSIZE erhöht werden.

Programmsteuerung verwenden

Mit dem Debugprogramm dbx können Sie Unterbrechungspunkte (Haltestellen) im Programm setzen. Nach der Eingabe des Programms dbx können Sie angeben, welche Zeilen oder Adressen Unterbrechungspunkte sein sollen, und dann das Programm ausführen, das Sie mit dem Programm dbx debuggen wollen. Das Programm wird angehalten und berichtet, wenn es einen Unterbrechungspunkt erreicht. Anschließend können Sie den Status Ihres Programms mit dbx -Befehlen untersuchen.

Eine Alternative zum Festlegen von Unterbrechungspunkten besteht darin, Ihr Programm zeilenweise oder instruktionsweise auszuführen, eine Prozedur, die als Einzelschritt bezeichnet wird.

Unterbrechungspunkte festlegen und löschen

Verwenden Sie den Unterbefehl stop , um Unterbrechungspunkte im Programm dbx festzulegen. Der Unterbefehl stop stoppt das Anwendungsprogramm, wenn bestimmte Bedingungen erfüllt sind:

  • Die Variable wird geändert, wenn der Parameter Variable angegeben wird.
  • die Bedingung wahr ist, wenn das Flag if Bedingung verwendet wird.
  • Die Prozedur wird aufgerufen, wenn das Flag in Prozedur verwendet wird.
  • Die Zeilennummer SourceLine wird erreicht, wenn das Flag at SourceLine verwendet wird.

    Hinweis: Die Variable SourceLine kann als Ganzzahl oder als Dateinamenzeichenfolge gefolgt von einem Doppelpunkt (:) und einer Ganzzahl angegeben werden.

Nach jedem dieser Befehle antwortet das Programm dbx mit einer Nachricht, die die Ereignis-ID, die Ihrem Unterbrechungspunkt zugeordnet ist, zusammen mit einer Interpretation Ihres Befehls meldet. Mit dem Unterbefehl addcmd können Sie der angegebenen Ereignis-ID dbx-Unterbefehle zuordnen. Diese zugeordneten dbx-Unterbefehle werden ausgegeben, wenn der Unterbrechungspunkt, Tracepunkt oder Überwachungspunkt, der diesem Ereignis entspricht, erreicht wird. Mit dem Unterbefehl delcmd können Sie die zugehörigen Unterbefehle dbx aus der angegebenen Ereignis-ID löschen.

Programm ausführen

Der Unterbefehl run startet Ihr Programm. Es weist das Programm dbx an, mit der Ausführung der Objektdatei zu beginnen und alle Argumente so zu lesen, als wären sie in der Shellbefehlszeile eingegeben worden. Der Unterbefehl rerun hat dasselbe Format wie run. Der Unterschied besteht darin, dass die Argumentliste aus der vorherigen Ausführung verwendet wird, wenn keine Argumente übergeben werden. Nachdem das Programm gestartet wurde, wird es fortgesetzt, bis eines der folgenden Ereignisse eintritt:

  • Das Programm erreicht einen Unterbrechungspunkt.
  • Es tritt ein Signal auf, das nicht ignoriert wird, z. B. INTERRUPT oder QUIT.
  • Ein Mehrprozessereignis tritt auf, während das Mehrprozessdebugging aktiviert ist.
  • Das Programm führt einen Befehl load, unload, oder Subroutine loadbind .

    Hinweis: Das Programm dbx ignoriert diese Bedingung, wenn die Debugvariable $ignoreload gesetzt ist. Dies ist die Standardeinstellung. Weitere Informationen finden Sie in der Beschreibung des Unterbefehls set .

  • Das Programm wird beendet.

In jedem Fall erhält das Debugprogramm dbx die Steuerung und zeigt eine Nachricht an, die erläutert, warum das Programm gestoppt wurde.

Es gibt mehrere Möglichkeiten, das Programm fortzusetzen, sobald es gestoppt wird:

Befehl Beschreibung
cont Setzt das Programm an der Stelle fort, an der es gestoppt wurde.
abhängen Setzt das Programm an der Stelle fort, an der es gestoppt wurde, und beendet das Debugprogramm. Dies ist nützlich, nachdem Sie das Programm korrigiert haben und ohne das Debugprogramm fortfahren möchten.
Rückgabe Setzt die Ausführung fort, bis eine Rückkehr zu Prozedur gefunden wird oder bis die aktuelle Prozedur zurückgegeben wird, wenn Prozedur nicht angegeben ist.
Überspringen Setzt die Ausführung bis zum Ende des Programms oder bis zur Ausführung von Anzahl + 1 Unterbrechungspunkten fort.
Schritt Führt eine oder eine angegebene Anzahl von Quellenzeilen aus
Nächste Läuft bis zur nächsten Quellenzeile oder führt eine angegebene Anzahl Quellenzeilen aus.

Eine gängige Methode für das Debugging besteht darin, das Programm zeilenweise durchzugehen. Die Unterbefehle step und next dienen diesem Zweck. Die Unterscheidung zwischen diesen beiden Befehlen ist nur sichtbar, wenn die nächste auszuführende Quellenzeile einen Aufruf an ein Unterprogramm beinhaltet. In diesem Fall wird der Unterbefehl step im Unterprogramm gestoppt. Der Unterbefehl next wird ausgeführt, bis das Unterprogramm beendet ist, und dann bei der nächsten Anweisung nach dem Aufruf gestoppt.

Mit der Debugvariablen $stepignore kann das Verhalten des Unterbefehls step geändert werden.

Diesen Stopps ist keine Ereignisnummer zugeordnet, da dem Stoppen eines Programms kein permanentes Ereignis zugeordnet ist.

Wenn Ihr Programm mehrere Threads enthält, werden sie alle normal während der Unterbefehle cont, next, nextiund step ausgeführt. Diese Befehle wirken sich auf den aktiven Thread aus (der Thread, der die Ausführung durch Erreichen eines Unterbrechungspunkts gestoppt hat), d. h., selbst wenn ein anderer Thread den Code ausführt, der abgestuft wird, wird cont, next, nexti, Die Operation step wird fortgesetzt, bis der aktive Thread diesen Code ebenfalls ausgeführt hat.

Wenn diese Unterbefehle nur den aktiven Thread ausführen sollen, können Sie die dbx -Debugprogrammvariable $hold_nextfestlegen. Dies bewirkt, dass das dbx -Debugprogramm alle anderen Benutzerthreads während conthält. Unterbefehle next, nextiund step .

Hinweis: Wenn Sie diese Funktion verwenden, denken Sie daran, dass ein gehaltener Thread keine Sperren freigeben kann, die er angefordert hat. Ein anderer Thread, der eine dieser Sperren erfordert, könnte Ihr Programm blockieren.

dbx-Ausgabe von Programmausgabe trennen

Mit dem Unterbefehl screen können Sie Programme debuggen, die anzeigenorientiert sind, z. B. Texteditoren oder Grafikprogramme. Dieser Unterbefehl öffnet ein Xwindow für die Interaktion mit dem Befehl dbx . Das Programm arbeitet weiterhin in dem Fenster, aus dem es stammt. Wenn screen nicht verwendet wird, wird die dbx -Programmausgabe mit der anzeigenorientierten Programmausgabe gemischt.

Traceerstellung für Ausführung

Der Unterbefehl trace weist das Programm dbx an, Informationen zum Status des Programms auszugeben, für das das Debugging ausgeführt wird, während dieses Programm ausgeführt wird. Der Unterbefehl trace kann ein Programm erheblich verlangsamen, abhängig davon, wie viel Arbeit das dbx -Programm ausführen muss. Es gibt fünf Formen der Programmtraceerstellung:

  • Sie können das Programm in einem einzigen Schritt ausführen und jede ausgeführte Quellcodezeile ausgeben. Die Debugvariable $stepignore kann verwendet werden, um das Verhalten des Unterbefehls trace zu ändern. Weitere Informationen finden Sie in der Beschreibung des Unterbefehls set .
  • Sie können das Drucken von Quellenzeilen so beschränken, dass die angegebene Prozedur aktiv ist. Sie können auch eine optionale Bedingung angeben, um zu steuern, wann Traceinformationen erstellt werden.
  • Sie können festlegen, dass jedes Mal eine Nachricht angezeigt werden soll, wenn eine Prozedur aufgerufen wird oder zurückkehrt.
  • Die angegebene Quellenzeile kann gedruckt werden, wenn das Programm diese Zeile erreicht.
  • Sie können den Wert eines Ausdrucks drucken, wenn das Programm die angegebene Quellenzeile erreicht.

Das Löschen von Traceereignissen entspricht dem Löschen von Stoppereignissen. Wenn der Unterbefehl trace ausgeführt wird, wird die zugeordnete Ereignis-ID zusammen mit der internen Darstellung des Ereignisses angezeigt.