我正在尝试逐步完成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步进时会在函数中的下一个执行语句处停止”?