Kann ich gdb springen Vergangenheit eine throw-Anweisung am Ende einer Funktion?
Wenn ich Debuggen, ich finde manchmal ist es nützlich, um "replay" die letzten Anweisungen von code. Zum Beispiel:
void foo (int & i) {
i = 0;
++i;
i++;
}
Während der Ausführung dieser durch den debugger können Sie fügen Sie einen Haltepunkt an den Anfang der Funktion Körper, und dann von jeder Anweisung innerhalb der foo
wenn Sie der Typ: "jump-Datei.cc:2" der debugger wieder zurück zu i = 0
. Ich Schätze, dass dies nicht immer perfekt, aber manchmal kann es ausreichen, um den bug finden, die Sie suchen.
Bin ich derzeit ein problem, dass die Ergebnisse in eine exception geworfen. Die exception wird geworfen auf dem Boden einer aufgerufenen Funktion, also so etwas wie:
void bar ()
{
throw int ();
}
void foo (int & i)
{
i = 0;
++i;
bar ();
i++;
}
int main ()
{
try
{
int i;
foo (i);
}
catch (...)
{
}
}
Was ich im Stande sein will zu tun, ist, setzen Sie einen breakpoint vor throw int ()
, dann überspringen Sie einfach dieser Anweisung beenden Sie die Funktion bar - so dass ich dann springen zurück bis zu den i = 0
Linie in foo.
Gibt es eine Möglichkeit, ich kann springen Vergangenheit throw int ()
oder beenden von bar
ohne Ausführung der throw-Anweisung?
Scheint das problem zu sein, dass es keine Anweisung nach der throw
also ich habe nirgends zu setzen, breakpoint-ich will springen zum.
UPDATE:
Hervorzuheben, was passiert, in meinem einfachen Beispiel oben:
This GDB was configured as "i486-slackware-linux"...
(gdb) break bar
Breakpoint 1 at 0x804856a: file t.cc, line 3.
(gdb) run
Starting program: ..../t
Breakpoint 1, bar () at t.cc:3
(gdb) break t.cc:4
Breakpoint 2 at 0x8048592: file t.cc, line 4.
(gdb) jump t.cc:4
Line 4 is not in `bar()'. Jump anyway? (y or n) y
Continuing at 0x8048592.
Breakpoint 2, foo (i=@0xb80155eb) at t.cc:6
Die engen lockigen für 'bar' in Zeile 4 t.cc " aber gdb betrachtet dies als Haltepunkt für foo
.
- Welchen nutzen würden gdb sein, wenn er konnte nicht zulassen, dass Sie Haltepunkte an jedem Punkt der code in einem Programm?
- gdb ermöglicht das setzen von Haltepunkten, wo es ist "code", nicht an jedem beliebigen Punkt. Das ist das problem, es scheint nicht möglich zu finden, um das Ende der Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie können. Sie müssen den instruction-pointer auf den Wert, den Sie wollen.
Meine schlechte Rechtschreibung hat tatsächlich mich mit der Antwort!
Meine variation von "zerlegen" war nicht die Arbeit, so bei der Suche nach der richtigen Rechtschreibung ich schließlich stolperte auf "Hilfe-stack":
Den zurück Befehl aus der obigen Liste tut genau das, was ich will, in diesem Fall.
Dank an Euch alle für Eure Hilfe.
In vielen Fällen wird der compiler beseitigen Ende der Funktion, da es nicht erreichbar ist. Möchten Sie vielleicht ein flag können Sie einstellen, um dies zu vermeiden:
Werden Sie sicher, dass das flag global (nicht static), damit der compiler kann es nicht beweisen, es wird nie geschrieben werden.
Zu überspringen werfen,
Und stellen Sie sicher, dass Sie es später wieder.
Weiter geht 's mit @Justin' s Antwort, während in der
bar()
Funktion Typdisassemble
, notieren Sie die Adresse desret
Anweisung, legen Sie dieeip
zu dieser Adresse.%eip
ist Plattform-spezifisch und erfordert einige Arbeit. Es ist einfacher, nurjump
auf die Nummer der Zeile mit dem Ende lockig. Sie müssen kombinieren Sie dies mit etwas wie bdonlan suggeriert im Fall der compiler die Optimierung des Rendite-aus-Funktion entfernt, da nicht erreichbar.