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.
Schreibe einen Kommentar