在gdb中使用带有throw语句的单步执行功能不会带我去捕捉语句

时间:2019-05-24 07:18:26

标签: c++ exception gdb try-catch throw

我正在尝试逐步完成C ++程序。它在较低的层中引发了异常,但是我无法让gdb调试器将我带到catch语句。一种解决方法是向(gdb) catch catch注册捕获点,但是必须记住始终这样做很麻烦,这将导致程序在较低层的每个捕获语句链处停止。

这里是一个复制品,以说明我的观点。对于使用g++ foo.cpp -g -o foo编译的程序。

#include <cstdio>

void f() {
    throw 42;
}
int main(int argc, char *argv[])
{
    try {
        throw 42;
        //f();
        printf("after throw\n");
    } catch (...) {
        printf("in catch stmt\n");
    }
    printf("after try-catch stmt\n");
}

.. Gdb的工作与我预期的一样:当我跨过throw语句时,下一条语句就是catch。

$ gdb -q foo
Reading symbols from foo...done.
(gdb) start
Temporary breakpoint 1 at 0x912: file foo.cpp, line 9.
Starting program: /home/dannas/foo
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdd88) at foo.cpp:9
9               throw 42;
(gdb) next
12          } catch (...) {
(gdb)
13              printf("in catch stmt\n");
(gdb)
in catch stmt
12          } catch (...) {

但是如果我将throw 42中的main语句替换为f(),那么如果我越过f(),程序将结束。

$ gdb -q foo
Reading symbols from foo...done.
(gdb) start
Temporary breakpoint 1 at 0x912: file foo.cpp, line 10.
Starting program: /home/dannas/foo

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdd78) at foo.cpp:10
10              f();
(gdb) n
in catch stmt
after try-catch stmt
[Inferior 1 (process 32522) exited normally]

版本:

 $ gdb --version
 GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
 $ gcc --version
 gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0

汤姆·特洛伊(Tom Troey)在https://stackoverflow.com/a/34601424/582010中说:

  

[...]有一个特殊的调试标记(函数或“ SDT”   探查”,具体取决于底层构建的方式)   引发异常时使用的代码。 gdb放置一个断点   在这个地方。当达到此断点时,gdb会检查目标   抛出的堆栈帧,如果在下一帧之上,则放置一个   在投掷目标处设置临时断点。

问题

gdb是否不知道下一步将执行哪一行?上面的引用似乎暗示gdb会努力找出基于可用catch处理程序的下一条语句是什么?有没有一种方法可以使调试器按我的预期运行:“ gdb步进时会在函数中的下一个执行语句处停止”?

0 个答案:

没有答案