Verfügt GDB über einen integrierten Skriptmechanismus, sollte ich ein Expect-Skript codieren oder gibt es eine noch bessere Lösung?
Ich sende jedes Mal die gleiche Befehlsfolge und speichere die Ausgabe jedes Befehls in einer Datei (höchstwahrscheinlich unter Verwendung des in GDB integrierten Protokollierungsmechanismus, es sei denn, jemand hat eine bessere Idee).
scripting
automation
gdb
expect
Anonym
quelle
quelle
Antworten:
gdb
führt die Datei.gdbinit
nach dem Ausführen aus. Sie können also Ihre Befehle zu dieser Datei hinzufügen und prüfen, ob dies für Sie in Ordnung ist. Dies ist ein Beispiel für.gdbinit
das Drucken der Rückverfolgung für allef()
Anrufe:quelle
Ich habe gerade etwas Ähnliches durchgemacht und mir ein einfaches Beispiel ausgedacht - und da ich wusste, dass ich es bald vergessen werde, dachte ich, ich sollte es besser posten.
:)
Also werde ich es hier posten, da es mit der Frage zusammenhängt.Grundsätzlich wollte ich in diesem Beispiel einige Variablenwerte an bestimmten Stellen des Codes erhalten. und lassen Sie sie ausgeben, bis das Programm abstürzt. Hier ist zunächst ein kleines Programm, das garantiert in wenigen Schritten abstürzt
test.c
:Der einzige Grund, warum das Programm Befehlszeilenargumente akzeptiert, besteht darin, die Anzahl der Schritte vor dem Absturz auswählen zu können - und zu zeigen, dass diese im Batch-Modus
gdb
ignoriert--args
werden. Dies kompiliere ich mit:Dann bereite ich das folgende Skript vor - der Haupttrick hier besteht darin,
command
jedem einen zuzuweisenbreakpoint
, der schließlichcontinue
(siehe auch gdb automatisieren: Rückverfolgung bei jedem Aufruf von Funktions-Puts anzeigen ). Dieses Skript nenne ichtest.gdb
:Beachten Sie, dass Sie, wenn Sie es im Batch-Modus verwenden möchten, das Skript am Ende mit
run
oderstart
oder ähnlichem "starten" müssen .Mit diesem Skript kann ich
gdb
im Batch-Modus aufrufen, wodurch die folgende Ausgabe im Terminal generiert wird:Beachten Sie, dass sich die Schleife, während wir das Befehlszeilenargument 5 angeben, immer noch nur zweimal dreht (wie in der Spezifikation
run
imgdb
Skript angegeben). Wennrun
keine Argumente vorhanden sind, dreht es sich nur einmal (der Standardwert des Programms) und bestätigt, dass dies--args ./test.exe 5
ignoriert wird.Da dies jetzt jedoch in einem einzigen Aufruf und ohne Benutzerinteraktion ausgegeben wird, kann die Befehlszeilenausgabe mithilfe der
bash
Umleitung einfach in einer Textdatei erfasst werden , z. B.:Es gibt auch ein Beispiel für die Verwendung von Python zur Automatisierung von GDB in c - GDB Auto Stepping - automatischer Ausdruck von Zeilen bei freiem Lauf?
Hoffe das hilft,
Prost!
quelle
detach
Innerhalbcommand
machtgdb
Absturz,continue
innerhalbcoammand
führt zu seltsamenSelected thread is running.
Warnungen.Wenn
-x
Ihnen ein mit einer Datei zu viel ist, verwenden Sie einfach mehrere-ex
.Dies ist ein Beispiel für die Verfolgung eines laufenden Programms, das die Rückverfolgung bei Abstürzen anzeigt (und speichert)
quelle