在"使用调试信息发布"模式下构建Qt?

Ash*_*iya 24 c++ qt qmake qt4

有没有办法在"Release with Debug info"模式下构建Qt?我的应用程序仅在"发布"模式下崩溃(在调试模式下工作正常),似乎问题来自Qt(可能是Qt中的错误).所以我想看看Qt的调试信息.

Qt docs有"debug","release"但不是"release with debug"模式.

[Upate]

我的应用程序适用于Mingw 32位Release/Debug和VSC++ Compiler 64bit Debug.

仅在VSC++ 64Bit Release上崩溃

有小费吗 ?

mil*_*anw 31

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

CONFIG += force_debug_info
Run Code Online (Sandbox Code Playgroud)

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

qmake CONFIG+=release CONFIG+=force_debug_info path/to/sources
Run Code Online (Sandbox Code Playgroud)

这将启用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
}
Run Code Online (Sandbox Code Playgroud)

这甚至会为工作,Qt 4.x但我们需要手动添加上述条件为default_post.prfQt 4.x

  • 配置+=force_debug_info (2认同)
  • @Splines 通过标准 `CMAKE_BUILD_TYPE=RelWithDebInfo` (2认同)

hmu*_*ner 16

我在我的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
Run Code Online (Sandbox Code Playgroud)

这样,您至少可以检查代码中是否发生了崩溃.不支持使用此模式构建Qt,请参阅此错误.你只能通过在Macke的答案中更改vcproj文件或Makefile来手动完成.

  • 简单的`=`似乎只是一个调试版本,它似乎与`+ =`一起正常工作. (2认同)

小智 11

在Qt5中,当调用时configure,只需添加选项即可-force-debug-info


Mac*_*cke 5

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

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

拥有调试信息对于在 Qt 和我们的应用程序之间来回移动的堆栈跟踪确实是无价的。

这是相关的片段:

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))
Run Code Online (Sandbox Code Playgroud)