在“发布和调试信息”模式下构建Qt?

37

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

Qt文档有“调试”、“发布”但没有“发布带调试”模式。

[更新]

我的应用程序在Mingw 32位Release/Debug和VSC ++编译器64位Debug下都正常工作。

只有在VSC ++ 64位Release下崩溃

有什么提示吗?


1
有时候 Q_ASSERT 语句是这种行为的原因。例如,如果你使用 Q_ASSERT((pObject = getObject()) != NULL);,那么在发布模式下,pObject = getObject() 这一行不会被执行。你可能需要检查这样的问题或者调试开关。 - Tim Meyer
8个回答

52

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

CONFIG += force_debug_info

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

即使在发行模式下也可以获得调试符号。当您通过命令行使用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


2
CONFIG += force_debug_info - BuvinJ
1
@BuvinJ:问题的标题是“带调试信息的发布”。如果您想要一个真正的调试版本,请使用CONFIG += debug - 不需要在调试版本中强制使用调试信息。 - milianw
1
"CONFIG+=force_debug_info" 添加到我的 qmake.exe 调用中是我需要做的,以便于针对 Qt 项目进行 PDBs 的即时生成,而不会干扰任何人的项目文件。 - kayleeFrye_onDeck
1
在CMakeLists.txt文件中,CONFIG += force_debug_info的等效语句是什么? - Splines
2
通过标准的 CMAKE_BUILD_TYPE=RelWithDebInfo,使用 @Splines。 - milianw
显示剩余6条评论

16

我在我的qmake文件中使用以下代码来生成带有调试信息的发布版本:

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是不受支持的,请参阅此错误. 您只能通过手动更改vcproj文件或Makefile来执行此操作,例如Macke的回答。


2
似乎只有使用 += 才能正常工作,使用普通的 = 只会生成调试版本。 - Matteo Italia
milianw的回答建议的那样添加force_debug_info也会导致这种情况,但这是一种更直接的方法,即使对于Qt4也可以使用。 - Top-Master

14
在Qt5中,调用configure时,只需添加选项-force-debug-info就可以了。

是的,您需要通过configure和您选择的编译器自己构建Qt。 - Pixtar

7

更新:请参考下面@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))

1

适用于Linux用户

./configure -prefix /opt/qt -release -force-debug-info -opensource -nomake tests -no-avx -no-avx2 -no-avx512

make V=1 -j8
make install

附注:如果您的CPU支持AVX、AVX2或AVX512,请删除-no-avx、-no-avx2和-no-avx512选项。


1

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


在编译QT时,如何在运行"./configure"时进行设置? - Ashika Umanga Umagiliya
应该有类似的环境变量用于./configure。我不确定,也许是CXXFLAGS。请查看./configure脚本。 - ks1322

1
使用此模式构建Qt不受支持,请参见此错误。您只能通过手动更改vcproj文件或Makefile来执行此操作,就像Macke的答案中所述。
值得一提的是,在Qt 4.8中,这个错误似乎已经被修复了。我将这两行代码复制到我的.pro文件中,它就像魔法般地工作了。

0
只需在Qt Creator的项目选项卡中选择“Profile build”而不是调试或发布版本即可。这将向qmake调用添加许多参数。
qmake.exe someproject.pro -spec win32-msvc "CONFIG+=qml_debug" 
"CONFIG+=qtquickcompiler" "CONFIG+=force_debug_info" "CONFIG+=separate_debug_info"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接