Dan*_*und 5 c++ gdb exception 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");
}
Run Code Online (Sandbox Code Playgroud)
.. 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 (...) {
Run Code Online (Sandbox Code Playgroud)
但是,如果我取代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]
Run Code Online (Sandbox Code Playgroud)
版本:
$ 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
Run Code Online (Sandbox Code Playgroud)
汤姆·特洛伊(Tom Troey)在/sf/answers/2422099711/中说:
引发异常时使用的低级展开代码中有一个特殊的调试标记(函数或“ SDT探针”,具体取决于构建方式)。gdb在该位置放置一个断点。当达到此断点时,gdb会检查该抛出的目标堆栈帧,如果它在下一帧之上,则将一个临时断点置于该抛出的目标处。
gdb无法知道下一步将执行哪一行吗?上面的引用似乎暗示gdb会努力找出基于可用catch处理程序的下一条语句是什么?有没有一种方法可以使调试器按我的预期运行:“ gdb步进时会在函数中的下一个执行语句处停止”?
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |