如何在catch块中设置断点?(c++)

如何在catch块中设置断点?(c++),c++,debugging,gdb,C++,Debugging,Gdb,当我尝试调试应用程序时,发生了一些奇怪的事情。简单地说,当我在try-catch块的catch部分设置断点时,调试器不会在断点上停止 这里有一个例子 try { throw std::overflow_error("test"); } catch (...) { qDebug() << "caught"; // HERE, I SET BREAKPOINT ON THIS LINE } 当发生异常时,它会打印屏幕上捕获的内容,但不会在此行停止。如果你想知道;是的,我

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

这里有一个例子

try {
    throw std::overflow_error("test");
} catch (...) {
    qDebug() << "caught"; // HERE, I SET BREAKPOINT ON THIS LINE
}
当发生异常时,它会打印屏幕上捕获的内容,但不会在此行停止。如果你想知道;是的,我正在调试模式下构建应用程序并在调试模式下运行

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

任何帮助都将不胜感激


谢谢。

@ben sen,我想任何观点都可能导致这种行为。有许多方法可以通过环境变量(也称为CFLAGS)或通过项目的IDE选项来指定这些选项,但它们都会导致编译器命令行中指定特定的-O选项。即使没有给出任何东西,请检查编译器的默认优化是什么。我的建议是明确地向编译器提供-O,并检查是否没有提供其他-O选项。

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

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

一旦你是那种人

catch throw 
在程序引发异常或异常时停止

catch catch 
停在挡块上


如果您需要捕获特定的库异常,请阅读以下线程:

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

一旦你是那种人

catch throw 
在程序引发异常或异常时停止

catch catch 
停在挡块上

如果需要捕获特定的库异常,请阅读以下线程:

对于使用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
while将在抛出和捕获时设置断点。

对于使用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

while将在throw和catch上设置断点。

您确定cv::threshold会抛出吗?*如果您的代码抛出异常,则只有它会出现在catch块中。所以请确保。@MohamadElghawi您问这个问题是对的。我没有提到对不起,这只是一个伪代码。它不必是阈值方法。使用catch-catch,gdb中的catch throw这是在Qt Creator中访问gdb控制台的方法:您需要键入catch-catch或catch-throw或两者来停止异常时的程序执行。您确定cv::threshold会抛出吗?*如果您的代码抛出异常,则只有它会出现在catch块中。所以请确保。@MohamadElghawi您问这个问题是对的。我没有提到对不起,这只是一个伪代码。它不必是阈值方法。在gdb中使用catch-catch,catch-throw这就是如何在Qt Creator中访问gdb控制台:您需要键入catch-catch或catch-throw或两者来停止异常时的程序执行。我道歉,我将我的注释放在错误的字段中-请不要将其视为答案,而是作为注释。谢谢,谢谢。我禁用了-O0的优化,并尝试重新编译我的应用程序。我道歉,我把我的评论放到了一个错误的栏位——请不要把它当作一个答案,而是当作一个评论。谢谢,谢谢。我禁用了-O0的优化,并尝试重新编译我的应用程序。它又一次没有停在挡块上。