【问题标题】:Build Qt in "Release with Debug Info" mode?在“使用调试信息发布”模式下构建 Qt?
【发布时间】:2011-10-23 00:16:59
【问题描述】:

有没有办法在“带有调试信息的发布”模式下构建 Qt?我的应用程序仅在“发布”模式下崩溃(在调试模式下工作正常)并且似乎问题来自 Qt(可能是 Qt 中的错误)。所以我想查看 Qt 的调试信息。

Qt docs 有“debug”、“release”但没有“release with debug”模式。

[更新]

我的应用程序可以在 Mingw 32 位发布/调试和 VSC++ 编译器 64 位调试中正常工作。

仅在 VSC++ 64 位版本上崩溃

有什么建议吗?

【问题讨论】:

  • 有时 Q_ASSERT 语句是这种行为的原因。如果你这样做 Q_ASSERT( ( pObject = getObject() ) != NULL );例如,行 pObject = getObject() 不会在发布模式下执行。你可能会检查类似的东西或调试开关。

标签: c++ qt qt4 qmake


【解决方案1】:

老问题,我知道。但是现在,您可以简单地使用

CONFIG += force_debug_info

即使在发布模式下也能获得调试符号。当您通过命令行使用QMake 时,我通常这样做是为了获得带有调试信息的发布版本:

qmake CONFIG+=release CONFIG+=force_debug_info path/to/sources

这将启用Qt5/mkspecs/features/default_post.prf的以下条件:

force_debug_info|debug: CONFIG += debug_info
force_debug_info {
    QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
    QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO
    QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
}

这甚至适用于Qt 4.x,但我们需要手动将上述条件附加到default_post.prf 中以获取Qt 4.x

【讨论】:

  • 截至目前,Qt4 不支持该功能
  • CONFIG += force_debug_info
  • 省略此处显示的release,除非您想将调试会话转入发布!
  • @BuvinJ:问题的标题是“Release with Debug Info”。如果您想要真正的调试版本,只需使用CONFIG += debug - 无需在调试版本中强制提供调试信息。
  • 也许我不明白你所指的上下文。通过在 Creator 中选择一个来处理调试/发布。这些参数自动以CONFIG 结束。如果这是您的推理,那么您在此处添加的版本不是声明的条件部分。将此行粘贴到 QMake 中会破坏调试/发布逻辑,特别是如果您还使用推荐的方法在 QMake 中测试发布与调试(评估 CONFIG)。这条线搞砸了我的一个项目。我放弃了发布部分,一切都很好。复制指令不会损害调试。
【解决方案2】:

我在我的 qmake 文件中使用它来使用 debuginfo 构建我的发布版本:

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

这样你至少可以检查你的代码中是否发生了崩溃。 不支持使用此模式构建 Qt,请参阅 bug。 您只能通过更改 vcproj-files 或 Makefiles 来手动完成,就像 Macke 的回答一样。

【讨论】:

  • Plain = 似乎只进行了调试构建,它似乎与 += 一起正常工作。
  • 添加force_debug_info like milianw 答案也会导致这种情况,但这是一种更直接的方式,甚至适用于Qt4
【解决方案3】:

在Qt5中,调用configure时,只需简单的添加选项-force-debug-info

【讨论】:

  • 是的,您需要通过 configure 和您选择的编译器自行构建 Qt。
【解决方案4】:

更新:见下面@milanw 的回答。现在直接在 qmake 中支持

我们使用 qmake 生成 vcproj 文件来构建 Qt。我编写了一个 python 脚本(但 sed 也很好)来更改 vcproj 文件以在发布时使用调试信息进行构建。

拥有调试信息对于在 Qt 和我们的应用程序之间来回切换的堆栈跟踪确实非常宝贵。

这是相关的sn-p:

for root, dirs, files in os.walk( qt_build_dir ):
    for f in files:
      if not f.endswith('.vcproj'):
          continue

      output = []
      with open(pj(root, f), 'r') as file:
          for line in file.readlines():
              line = line.strip()
              if 'DebugInformationFormat="0"' == line:
                  output.append('\t\t\t\tDebugInformationFormat="3"')
              elif 'GenerateDebugInformation="false"' == line:
                  output.append('\t\t\t\tGenerateDebugInformation="true"')
              else:
                  output.append(line)

      with open(pj(root, f), 'w') as file:
          file.write('\n'.join(output))

【讨论】:

    【解决方案5】:

    不支持使用此模式构建 Qt,请参阅此错误。您只能通过更改 vcproj-files 或 Makefiles 来手动完成,就像 Macke 的回答一样。

    我可以补充一点,在 Qt 4.8 中,这个错误似乎已被修复。我将这两行复制到我的 .pro 文件中,效果非常好。

    【讨论】:

      【解决方案6】:

      看起来您需要调整 QMAKE_CFLAGS_RELEASE 变量。如果是 gcc,您只需添加 -g 选项即可添加调试信息。

      【讨论】:

      • 编译QT的时候运行“./configure”怎么给?
      • ./configure 应该有类似的环境变量。我不太清楚,可能是CXXFLAGS。查看 ./configure 脚本。
      【解决方案7】:

      只需在 Qt Creator 的项目选项卡中选择配置文件构建,而不是调试或发布构建。它会为 qmake 调用添加很多参数。

      qmake.exe someproject.pro -spec win32-msvc "CONFIG+=qml_debug" 
      "CONFIG+=qtquickcompiler" "CONFIG+=force_debug_info" "CONFIG+=separate_debug_info"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 2014-02-18
        相关资源
        最近更新 更多