Когда я отлаживаю, я иногда нахожу полезным «воспроизвести» последние несколько утверждений кода. Например:
void foo (int & i) {
i = 0;
++i;
i++;
}
Во время выполнения этого через отладчик вы можете добавить точку останова вверху тела функции, а затем из любого оператора внутри foo
, если вы введете: «jump file.cc:2», отладчик вернется обратно до i = 0
. Я ценю, что это не всегда идеально, но иногда этого может быть достаточно, чтобы найти искомую ошибку.
В настоящее время я изучаю проблему, которая приводит к возникновению исключения. Исключение создается в нижней части вызываемой функции, поэтому что-то вроде:
void bar ()
{
throw int ();
}
void foo (int & i)
{
i = 0;
++i;
bar ();
i++;
}
int main ()
{
try
{
int i;
foo (i);
}
catch (...)
{
}
}
То, что я хочу сделать, - это поставить точку останова перед throw int ()
, затем перепрыгнуть только через это утверждение, завершить функциональную панель - чтобы я мог затем вернуться к строке i = 0
в Foo.
Есть ли способ, которым я могу перепрыгнуть через throw int ()
или закончить из bar
без выполнения оператора throw?
Проблема заключается в том, что после throw
нет оператора, поэтому мне некуда поставить точку останова, к которой я хочу перейти.
UPDATE:
Чтобы подчеркнуть, что происходит в моем простом примере выше:
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
Курчавое закрытие для 'bar' находится в строке 4 t.cc, однако GDB считает это точкой останова для foo
.