【问题标题】:Qt debugging in release mode - all methods not working发布模式下的 Qt 调试 - 所有方法都不起作用
【发布时间】:2016-01-19 17:08:03
【问题描述】:

我正在尝试使用QtCreator 中的MinGW 构建我的Qt 应用程序,以尝试调试仅发布的崩​​溃。

这是我放入 .pro 文件的内容(也尝试将其直接放入 qmake.conf):

QMAKE_CFLAGS_RELEASE += -g
QMAKE_CXXFLAGS_RELEASE += -g
QMAKE_CXXFLAGS += -g

也尝试过

QMAKE_CFLAGS_RELEASE += -ggdb
QMAKE_CXXFLAGS_RELEASE += -ggdb
QMAKE_CXXFLAGS += -ggdb

我像这样单独或一起尝试过它们:

QMAKE_CFLAGS_RELEASE += -g
QMAKE_CXXFLAGS_RELEASE += -g
QMAKE_CXXFLAGS += -g
QMAKE_CFLAGS_RELEASE += -ggdb
QMAKE_CXXFLAGS_RELEASE += -ggdb
QMAKE_CXXFLAGS += -ggdb

我还手动编辑了生成的Makefile(准确地说是Makefile.Release,并检查了Makefile.Debug以防万一)以删除NO_DEBUG标志(我不知道为什么它被放在那里)和确保有-g-ggdb 标志。

所有这些的结果是应用程序的构建时间几乎是两倍,但是它的大小与以前完全相同,并且没有任何调试符号,并且尝试调试它没有成功。

我还能做什么?我知道这是可能的,但寻找其他答案只会引导我使用这些标志,而这根本没有帮助(只会让构建速度变慢)

【问题讨论】:

  • 您是否也尝试修改 QMAKE_LFLAGS?可能是链接器剥离了调试符号。
  • @SergeyTachenov 这很有意义并解释了额外的构建时间,但是我必须向链接器添加什么标志?
  • 由于 MinGW 基本上是 GCC,我怀疑应该使用相同的标志。至少值得一试。
  • 有一个 -export-all-symbols 标志,我也试试
  • 导出符号是一回事(尽管我认为 GCC 默认导出所有内容),调试信息是另一回事(行号等)。但无论如何它不应该受到伤害。

标签: c++ qt makefile qt-creator


【解决方案1】:

在 qmake.conf 中(不记得现在在哪里)默认行为设置为:

QMAKE_LFLAGS_RELEASE = -Wl,-s

-s 表示链接器取消符号信息。因此,除了您设置的标志之外,您还需要清除 QMAKE_LFLAGS_RELEASE 中的标志(或覆盖)。在您的情况下,只需将其设置为空就可以了,因此在您的 .pro 文件中添加:

QMAKE_LFLAGS_RELEASE =

补充说明

如果您将message(QMAKESPEC: $$QMAKESPEC) 行添加到您的.pro 文件中,当您运行qmake 时,您将看到您的make 规范的路径。查看 qmake.conf 文件(它将包含包含)并按照自己的方式处理它们。

假设您使用的是 Windows(因为我没有看到 Qt 5.5.1 的 linux make 规范中设置的 -Wl,-s 选项),那么有问题的文件是: <path-to-qt>/5.5/gcc_64/mkspecs/win32-g++/qmake.conf

无论如何,我没有看到任何其他有用的标志设置(我使用的是 linux,所以这只是肉眼检查。但是,如果您担心,请将以下内容添加到您的 .pro 文件中:

message(QMAKE_LFLAGS_RELEASE: $$QMAKE_LFLAGS_RELEASE)

在进行更改之前对其进行检查,然后您将全面了解正在发生的事情:)

【讨论】:

  • 在我清除它之后我没有添加任何新内容,对吗?
  • 嗯这似乎以一种奇怪的方式影响了我的 exe,现在我双击它并没有任何反应。这是我尝试调试时显示的内容:“调试开始调试已完成”
  • 也许我正在删除一个重要的链接器标志?
  • 好吧,也许......但在这种情况下,我认为您只是删除了默认标志,然后您可以在此之后添加任何标志。试试吧,如果成功了,那就担心其他标志:) .... 而且,往下看,我认为@SergeyTachenov 的想法可能是一个更好的最终解决方案,我的答案真的是让你走上正确的道路/得到一些工作:)
  • @shortage_radeon 添加注释以回答,以便您查看默认的链接器选项...
【解决方案2】:

我刚刚想通了,之后才看到@code_fodder 的回答。看起来@code_fodder 基本上是正确的,但我正在添加更多细节以反映对我有帮助的精确步骤。

我在 Qt Creator 项目设置中指定了 qmake 参数,如下所示:

QMAKE_CXXFLAGS+=-g QMAKE_LFLAGS_RELEASE-=-Wl,-s

这实际上将-g 添加到编译器标志中,并从链接器标志中删除-Wl,-s(这会去除所有符号)。然后我运行了qmake 并进行了完全重建。 之后,调试有点工作了——正如你对发布版本所期望的那样:由于优化,以某种随机的方式从一行跳到另一行,但至少它起作用了。

我在 64 位 Windows 7 系统上使用带有捆绑 MinGW 的 32 位 Qt 5.5.1,如果有帮助的话。

【讨论】:

  • 您确定要删除 -Wl 吗?我读到了一些关于“——如果链接器是通过编译器驱动程序(例如 gcc)间接调用的,那么所有链接器命令行选项都应该以 -Wl 为前缀”
  • @shortage_radeon, -Wl,-s 是一个将-s(条带符号)选项传递给链接器的选项。我正在删除整个 -Wl,-s 东西!当然,只删除 -Wl 并单独留下 -s 是没有任何意义的,但这不是我在这里要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2011-10-23
相关资源
最近更新 更多