【问题标题】:Qt and C++ : app crashes only in debug mode [duplicate]Qt 和 C++:应用程序仅在调试模式下崩溃 [重复]
【发布时间】:2018-11-08 15:10:13
【问题描述】:

我无法理解某事。所以我有一个使用带有 lambda 函数的 std::for_each 的方法。在这个 lambda 函数中,我做了一个 dynamic_cast。这只是一个小背景。此 dynamic_cast 崩溃。我不是在问它为什么会崩溃或如何修复它,因为我知道(我对已删除的对象进行了 dynamic_cast)。我的问题是为什么这只在调试模式下崩溃(在 Qt 中)?

我明白为什么它在调试时崩溃,但我不明白为什么它在发布时不崩溃。几周前我在不同的代码上遇到了类似的问题,但两次崩溃都是分段错误。是否因为 segfault 是一种未定义的行为,并且这种行为在 debug 和 release 之间是不同的?

谢谢。

【问题讨论】:

  • 未定义的行为很有趣。它允许编译器将非工作代码转换为“工作”代码。
  • 也许有助于查看“未定义”一词的定义。根据 C++ 标准,它意味着对程序的行为没有限制,用简单的英语来说,它意味着没有清楚或精确地显示、描述或限制。因此,未定义的行为意味着您不能期待任何特别的事情。因此:您对代码可能崩溃的期望与“未定义”一词的含义不一致:您使该词具有它不具有的含义。

标签: c++ qt debugging crash segmentation-fault


【解决方案1】:

我假设您正在运行 Linux。如果是这样,您可以使用 gdb(使用 -g 标志进行编译)。在动态转换处设置断点。然后,您可以单步执行以下每个功能。或许这样可以让你更好的理解qt中debug和release模式的区别。

这里是有用的gdb commands的一个很好的概述。

【讨论】:

    【解决方案2】:

    我认为您有内存泄漏或内存灌浆。您可以尝试使用 Valgrind 来查找程序中可疑和危险的地方。

    还要检查您是否在框架中正确使用了 ASSERT 指令等。 ASSERT 里面的表达式应该不会影响程序的逻辑,因为在 release 中,很多 ASSERT 的实现都没有被执行。

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2011-05-04
      • 2012-03-14
      • 2018-03-22
      相关资源
      最近更新 更多