Ist es in gdb möglich, zu einer Zeile vor der aktuell ausgeführten Zeile zu wechseln? z.B:
void my_fun( somePtrType** arr,int start,int end)
{
// arr is an array of pointers to somePtrType
//line a
... some assignments
swap(&arr[ind1] , &arr[ind2] ) ;
//line b (current line )
}
Ich bin derzeit in Zeile b und kann die arr
Werte dort überprüfen , aber ich möchte zu Zeile a zurückkehren und den Inhalt von arr
zu diesem Zeitpunkt untersuchen.
Ich denke, es ist möglicherweise nicht möglich, weil ein Debugger einen Code in Zeitlupe ausführen kann, ihn aber nicht rückwärts ausführen kann.
Noch mehr Einblicke ..
Target multi-thread does not support this command.
:(start
... dann Typtarget record-full
. Abkürzung istrn
.record
das gleiche wietarget record-full
? Es scheint für mich zu funktionieren und es ist der erste Befehl, der unter sourceware.org/gdb/current/onlinedocs/gdb/…Ja, mit realer Hardware (dh nicht nur mit einer VM) ist dies jetzt möglich und unkompliziert. GDB-7.0 unterstützt das Reverse-Debugging mit Befehlen wie Reverse-Step und Reverse-Continue auf nativen Linux x86-Computern.
Hier finden Sie ein Tutorial: http://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial
quelle
Mozilla rr
https://github.com/mozilla/rr
Der in GDB integrierte Datensatz und die Wiedergabe weisen schwerwiegende Einschränkungen auf, z. B. keine Unterstützung für AVX-Anweisungen: Das Reverse-Debugging von GDB schlägt mit "Prozessdatensatz unterstützt Anweisung 0xf0d an Adresse nicht fehl" fehl.
Oberseite von rr:
Das folgende Beispiel zeigt einige seiner Funktionen, vor allem die
reverse-next
,reverse-step
undreverse-continue
Befehle.Unter Ubuntu 18.04 installieren:
Testprogramm:
reverse.c
kompilieren und ausführen:
Jetzt befinden Sie sich in einer GDB-Sitzung und können das Debuggen ordnungsgemäß rückgängig machen:
rr erreicht dies, indem das Programm zunächst so ausgeführt wird, dass aufgezeichnet wird, was bei jedem einzelnen nicht deterministischen Ereignis passiert ist, z. B. bei einem Thread-Wechsel.
Während des zweiten Wiederholungslaufs wird diese überraschend kleine Ablaufverfolgungsdatei verwendet, um genau das zu rekonstruieren, was beim ursprünglichen nicht deterministischen Lauf passiert ist, jedoch auf deterministische Weise, entweder vorwärts oder rückwärts.
rr wurde ursprünglich von Mozilla entwickelt, um ihnen zu helfen, Timing-Fehler zu reproduzieren, die bei ihren nächtlichen Tests am nächsten Tag auftraten. Der Aspekt des umgekehrten Debuggens ist jedoch auch von grundlegender Bedeutung, wenn Sie einen Fehler haben, der nur Stunden innerhalb der Ausführung auftritt, da Sie häufig einen Schritt zurücktreten möchten, um zu untersuchen, welcher vorherige Status zu dem späteren Fehler geführt hat.
Die schwerwiegendsten Einschränkungen von rr sind meiner Meinung nach:
UndoDB ist eine kommerzielle Alternative zu rr: https://undo.io Beide basieren auf Trace / Replay, aber ich bin mir nicht sicher, wie sie sich in Bezug auf Funktionen und Leistung vergleichen lassen.
quelle
Kurze Antwort : Nein.
Um dieses Problem zu umgehen, lesen Sie unten.
Obwohl es in Zeile b nicht möglich ist, den Wert in Zeile a zu bestimmen, ist es möglich, den Wert von arr an a und b und anderen Stellen zu protokollieren, indem nur ein Haltepunkt getroffen wird.
Wenn nun alle anderen Protokollierungs-Haltepunkte erreicht sind, wird der Wert von arr auf dem Bildschirm angezeigt, aber der Haltepunkt wartet nicht auf Benutzerinteraktion und fährt automatisch fort. Wenn Sie in Zeile b einen Haltepunkt erreichen, sehen Sie die vergangenen Werte von arr, die in gdb selbst protokolliert würden.
Abhängig von der Situation können Sie auch viele nützliche Informationen sichern (und anzeigen). Beispielsweise möchten Sie möglicherweise auch einen Schleifenzähler (z. B. i) ausgeben, wenn die obige Funktion in einer Schleife 10000 Mal aufgerufen wird. Das hängt wirklich davon ab, was Sie erreichen wollen.
quelle
Wenn Ihr Programm kurz ist, ist der übliche Trick:
r
, um das Debug neu zu startenGDB wurde dafür gemacht!
quelle
Nicht gdb, aber Sie können mit einem Debugger namens qira einfach in die Geschichte zurückkehren. Sie können die Aufwärts- und Abwärtspfeile verwenden, um hin und her zu gehen. Außerdem wird hervorgehoben, welche Register geändert wurden.
quelle
Laut GDB-Dokumenten und "wenn die Zielumgebung dies unterstützt", ja.
quelle
Wenn sich Ihr Setup-Code für arr direkt über "Zeile a" befindet (ein sehr häufiges Szenario), können Sie dies folgendermaßen tun:
tbreak myfilename.c:123
(Zeile 123 ist der Beginn des Setup-Codes für arr) dannDer "tbreak" verhindert, dass gdb das Programm nach dem Sprung fortsetzt (fortsetzt).
Dann können Sie den Setup-Code durchgehen oder einfach einen Haltepunkt auf "Zeile a" setzen und fortfahren
quelle
Jeder wünscht sich einen allwissenden Debugger wie diesen: https://web.archive.org/web/20150915150119/http://www.lambdacs.com/debugger/ , aber sie sind (abhängig von der Sprache / Maschine) schwer zu erreichen machen und haben viel Buchhaltung zu tun.
Im Moment ist es auf realer Hardware und nicht in einer VM nahezu unmöglich, dies zu tun.
quelle