跳过 GDB 中的 C++ throw 语句
Step over a C++ throw statement in GDB
在使用 GNU GDB 调试器调试 C++ 程序时,我可以使用 GDB 命令跳过下一行代码:
next
但是,当在下一行抛出异常时,例如
throw SomeException();
然后 GDB 继续 运行 直到下一个断点,而不是在 catch
块的第一行内停止。
这是 GDB 中的错误,还是我使用了错误的命令?
我在 MinGW32 / Windows 上使用 GDB 7.7 版。
在 Linux 这可以正常工作。特别是在抛出异常时使用的 low-level 展开代码中有一个特殊的调试标记(函数或“SDT 探针”,取决于事物的构建方式)。 GDB 在此位置放置一个断点。遇到此断点时,GDB 检查 throw
的目标堆栈帧,如果它在 next
ing 帧之上,则在 throw
的目标处放置一个临时断点。
这需要对 GDB 进行一些更改,还需要对 C++ 运行时进行一些更改,以便通知 GDB 关于 throw
s。据我所知,还没有人做过将此代码移植到 MinGW 的工作。也许可以通过修改 GCC 源代码中适当的 unwind-mumble.c
文件来完成。
在使用 GNU GDB 调试器调试 C++ 程序时,我可以使用 GDB 命令跳过下一行代码:
next
但是,当在下一行抛出异常时,例如
throw SomeException();
然后 GDB 继续 运行 直到下一个断点,而不是在 catch
块的第一行内停止。
这是 GDB 中的错误,还是我使用了错误的命令?
我在 MinGW32 / Windows 上使用 GDB 7.7 版。
在 Linux 这可以正常工作。特别是在抛出异常时使用的 low-level 展开代码中有一个特殊的调试标记(函数或“SDT 探针”,取决于事物的构建方式)。 GDB 在此位置放置一个断点。遇到此断点时,GDB 检查 throw
的目标堆栈帧,如果它在 next
ing 帧之上,则在 throw
的目标处放置一个临时断点。
这需要对 GDB 进行一些更改,还需要对 C++ 运行时进行一些更改,以便通知 GDB 关于 throw
s。据我所知,还没有人做过将此代码移植到 MinGW 的工作。也许可以通过修改 GCC 源代码中适当的 unwind-mumble.c
文件来完成。