我可以让gdb跳过函数末尾的throw语句吗?

Ric*_*den 5 debugging gdb

当我调试时,我有时发现"重放"最后几个代码语句很有用.例如:

void foo (int & i) {
  i = 0;
  ++i;
  i++;
}
Run Code Online (Sandbox Code Playgroud)

通过调试器运行时,您可以在函数体的顶部添加断点,然后从内部的任何语句中添加:foo如果键入:"jump file.cc:2",调试器将返回到i = 0.我很欣赏这并不总是完美的,但有时它足以找到你正在寻找的bug.

我正在调查导致异常被抛出的问题.异常被抛出在被调用函数的底部,所以类似于:

void bar ()
{
  throw int ();
}

void foo (int & i)
{
  i = 0;
  ++i;

  bar ();

  i++;
}

int main ()
{
  try
  {
    int i;
    foo (i);
  }
  catch (...)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,在之前设置一个断点throw int (),然后跳过那个语句,完成功能栏 - 这样我就可以跳回到i = 0foo中的那一行.

有没有办法可以跳过throw int (),或者在bar没有执行throw语句的情况下完成?

问题似乎是之后没有任何声明,throw所以我无处可放我想跳的断点.

更新:

要突出显示上面的简单示例中发生的事情:

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
Run Code Online (Sandbox Code Playgroud)

'bar'的紧密卷曲位于't.cc'的第4行,但是gdb认为这是一个断点foo.

Jus*_*tin 7

是的你可以.您需要将指令指针设置为所需的值.

  (gdb) set $eip = 0xValue
Run Code Online (Sandbox Code Playgroud)


Ric*_*den 5

我的拼写错误实际上为我提供了答案!

我的"反汇编"的变化不起作用,所以在寻找正确的拼写时,我最终偶然发现了"帮助堆栈":

检查堆栈.堆栈由堆栈帧组成.Gdb为最内层(当前正在执行的)帧的堆栈帧分配数字,从零开始计数.

在任何时候,gdb都将一帧标识为"选定"帧.对所选帧进行变量查找.当正在调试的程序停止时,gdb选择最里面的帧.以下命令可用于按编号或地址选择其他帧.

命令列表:

backtrace - 打印所有堆栈帧的回溯

bt - 打印所有堆栈帧的回溯

down - 选择并打印由此调用的堆栈帧

frame - 选择并打印堆栈帧

return - 使选定的堆栈帧返回其调用者

select-frame - 选择一个堆栈帧而不打印任何内容

up - 选择并打印调用此帧的堆栈帧

上面列表中的return命令完全符合我的要求.

感谢大家的帮助.