如何在捕获块中设置断点?(C++)

How to set breakpoint in catch block? (c++)

本文关键字:断点 C++ 设置      更新时间:2023-10-16

当我尝试调试应用程序时发生了一些奇怪的事情。只是当我在 try-catch 块的 catch 部分设置断点时,调试器不会在断点处停止。

下面是一个示例。

try {
    throw std::overflow_error("test");
} catch (...) {
    qDebug() << "caught"; // HERE, I SET BREAKPOINT ON THIS LINE
}

当发生异常时,它会在屏幕上打印"捕获",但它不会在此行停止。(如果你想知道;是的,我正在调试模式下构建应用程序并在调试模式下运行)

我是否缺乏关于 gdb 如何工作的基础知识?(我的意思是它可能不会停止,因为捕获部分中的断点不起作用)

任何帮助将不胜感激。

谢谢。

要在 IDE 中捕获异常,您需要直接在 gdb 控制台中发出 gdb 命令。以下是如何在Qt Create IDE中进入gdb控制台的链接:在Qt-Creator中访问gdb控制台

一旦你是类型

catch throw 

在程序引发异常时停止或

catch catch 

以在捕获块中停止。

如果需要捕获特定的异常,请阅读以下线程: GDB:抛出特定异常类型时如何中断?

对于使用LLDB的人,

# set on both throw and catch
breakpoint set -E C++ -h true
# or on catch
b __cxa_begin_catch
# or on throw
b __cxa_throw

同时将在投掷和接球时设置断点。

@ben森,我想任何意见都可能导致这种行为。有很多方法可以指定这些选项(通过环境变量(又名 CFLAGS 或通过项目的 IDE 选项),但它们都会导致编译器命令行提供一些特定的 -O 选项。即使什么都没有给出,请检查编译器的默认优化是什么。我的建议是明确地将 -O0 提供给编译者,并检查是否没有提供其他 -O 选项。