Qt 5.x嵌入式调试 - 部署剥离的二进制文件?

11

我认为(如有错误请纠正),在使用 gdbgdbserver 进行远程调试时,运行在 gdbserver 下的目标二进制文件不需要包含在二进制文件中的调试信息,但是运行 gdb 的主机需要。

我们带有调试符号的应用程序二进制文件大小为约112兆字节。如果运行strip命令,则二进制文件仅为6.7兆字节,这将更快地部署到我们的目标平台。

Qt Creator是否可以在部署之前对二进制文件进行strip操作?我们还能够进行调试吗?

2个回答

2
为了去除符号,你可以让Qt Creator在qmake和make之后运行一个最终的构建步骤,该步骤调用应用程序包中二进制文件上的“strip”命令。例如:-
strip -u -r ./MyApplication/Contents/MacOS/MyApplication

为了进行调试,您需要在构建过程中生成一个包含符号的单独的.dsym文件。如果它位于主机上,调试器应该会自动捕捉到它;lldb可以,但是对于gdb,您可能需要手动加载符号文件。

如何启用额外的构建步骤

从右侧工具栏中选择项目

Menu bar

请确保您在“生成和运行”选项卡上(GraphicsScene只是项目的名称)。

tabs

在“构建步骤”下,您会看到两个步骤,qMakeMake。选择添加构建步骤以进行自定义进程步骤。

Build Steps

在填写相关字段时,您可能需要更正路径,而不仅仅是复制它们。

Enter details

当构建完成后,strip命令将会运行。如果出现任何错误,很可能是strip命令的路径或您的应用程序包可执行文件的路径有问题。
请注意,如果您需要完整的strip路径,它位于/usr/bin/strip中。
至于符号文件,我认为您可以使用addsymbolfile命令,并将参数设置为dsym文件的路径。然而,gdb已经被弃用了,现在您应该使用lldb,一旦Spotlight索引了dsym文件,它将自动找到它。

我正在使用QtCreator和我的工具链的gdb,没有什么花哨的东西。该项目使用qmake从Creator构建。您能否详细说明如何启用额外的构建步骤,以及如何手动加载您提到的那些符号? - Steve
我已经根据你的问题更新了答案。 - TheDarkKnight
这个自定义流程步骤是开发者机器本地的吗,还是保存在.pro文件中?我希望能够实现这一点,并且让我的团队中的其他开发人员“只需工作”。我会在本周结束之前尝试一下。 - Steve
这个东西只能在开发者的机器上运行,但你可以将命令放到一个 bash 脚本中,并把自定义步骤指向该脚本。这样一来,你就可以往脚本中添加命令,并通过源代码控制分享它了。 - TheDarkKnight
你能解释一下 -r-u 这两个参数吗?我在 strip 的 man 手册中找不到它们。 - Philipp Ludwig
直接从10.15.4中的strip手册中获取-u 保存所有未定义符号。这是为可重定位对象使用的,以保存外部重定位条目引用的符号。请注意,常见符号也由外部重定位条目引用,而此标志不保存这些符号。 -r 保存动态引用的所有符号。 - TheDarkKnight

0

您可以这样删除调试符号:

在您的make文件中添加一行,这将从中删除所有调试符号:

cd $(MY_BINARY_INSTALL_PATH); strip --strip-debug $(MY_BINARY_INSTALL_PATH)/bin/mybinary -o $(MY_BINARY_INSTALL_PATH)/bin/mybinary

如果您想要从中删除所有符号,可以使用类似以下的内容:

cd $(MY_BINARY_INSTALL_PATH); strip --strip-all $(MY_BINARY_INSTALL_PATH)/bin/mybinary -o $(MY_BINARY_INSTALL_PATH)/bin/mybinary

删除所有符号将有助于显著减小二进制文件的大小。


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