【问题标题】:How to set breakpoint in catch block? (c++)如何在 catch 块中设置断点? (c++)
【发布时间】:2016-02-03 12:16:28
【问题描述】:

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

这是一个例子。

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

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

我是否对 gdb 的工作原理缺乏基本知识? (我的意思是它可能不会停止,因为 catch 部分中的断点不起作用)

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 你确定cv::threshold会抛出吗?
  • * 如果你的代码抛出异常,那么只有它会进入 catch 块。所以请确保。
  • @MohamadElghawi 你问这个问题是对的。对不起,我没有提到它,它只是一个伪代码。它不一定是阈值方法。
  • 在 gdb 中使用“catch catch, catch throw”
  • 这是在 Qt Creator 中访问 gdb 控制台的方法:stackoverflow.com/questions/4592643/… 您需要键入“catch catch”或“catch throw”(或两者)来停止程序在异常时执行。

标签: c++ debugging gdb


【解决方案1】:

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

一旦你是类型

catch throw 

当您的程序抛出异常时停止或

catch catch 

在 catch 块中停止。

如果您需要捕获特定的异常,请阅读此主题:GDB: How to break when a specific exception type is thrown?

【讨论】:

    【解决方案2】:

    对于使用 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 上设置断点。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我很抱歉,我把我的评论放到了一个错误的领域——请不要把它当作一个答案,而是作为一个评论。谢谢。
      • 谢谢。我通过 -O0 禁用了优化并尝试重新编译我的应用程序。再次,它并没有在 catch 块中停止。
      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2011-08-24
      相关资源
      最近更新 更多