LLDB - Qt 缺少调试信息

Posted

技术标签:

【中文标题】LLDB - Qt 缺少调试信息【英文标题】:LLDB - Qt missing debug info 【发布时间】:2018-01-09 18:08:53 【问题描述】:

我已经通过 macOS 安装程序安装了 Qt 5.10.0。 我目前正在运行 OSX El Capitan 10.11.6。

每当我尝试加载任何 Qt 库/框架时,都会收到以下警告:

warning: (x86_64) /Users/randomuser/Qt/5.10.0/clang_64/lib/QtWidgets.framework/QtWidgets empty dSYM file detected, dSYM was created with an executable with no debug info.

我可以通过运行 lldb QtWidgets.framework 来重现警告

我尝试设置 DYLD_IMAGE_SUFFIX=_debug,但这似乎不起作用。

另外,运行 otool -L QtWidgets.framework/Versions/5/QtWidgets_debug 报告库链接到 QtCore 和 QtGui 的发布版本。

任何见解将不胜感激,谢谢!

编辑: 为了详细说明我尝试使用 DYLD_IMAGE_SUFFIX,我尝试了以下操作,但仍然导致上述警告。

export DYLD_IMAGE_SUFFIX=_debug
lldb
>env DYLD_IMAGE_SUFFIX=_debug
>target create QtWidgets.framework
>warning: (x86_64) /Users/randomuser/Qt5.10.0/5.10.0/clang_64/lib/QtWidgets.framework/QtWidgets empty dSYM file detected, dSYM was created with an executable with no debug info.
>Current executable set to 'QtWidgets.framework' (x86_64).

【问题讨论】:

这通常发生在构建过程在剥离正在构建的 dSYM 的二进制文件之后构建 dSYM 时。命令“image list QTWidgets”将显示它找到的 dSYM 的路径。您可以使用终端中的“dwarfdump”工具查看 dSYM,但如果它没有说它是空的,我会感到惊讶。但听起来您需要联系组成您拥有的发行版的任何人,并让他们正确构建 dSYM。 我找到了 dSYM 包,它确实包含一个带有所有必要符号的 _debug 版本。如果我运行lldb QtWidgets.framework/Versions/5/QtWidgets_debug,它会找到该库的正确调试符号,但它会加载其依赖项的发布版本而不是调试版本(QtCoreQtGui 而不是QtCore_debugQtGui_debug)。似乎所有文件都在它们应该在的位置,但我无法让 lldb 加载调试版本。 您应该使用 DYLD_IMAGE_SUFFIX 环境变量来让 dyld 加载库的其他变体。查看“man dyld”以获取更多信息。您可以在传递给您正在启动的进程的环境中使用 lldb env 命令进行设置,也可以在 Xcode 中通过在项目的“运行”方案中进行设置。 我进行了编辑以包含有关我尝试使用 DYLD_IMAGE_SUFFIX 的更多信息。 对不起,我错过了原始描述中关于 DYLD_IMAGE_SUFFIX 的评论。请注意,lldb 并没有详尽地确定系统在运行之前实际加载的内容。除其他外,它不模拟 DYLD_IMAGE_SUFFIX 的效果。它也没有得到所有的 RPATH 技巧。在某些时候,这是一种收益递减的努力,因为当你跑步时,一切都会得到解决。所以你的第二个实验没有成功也就不足为奇了。 【参考方案1】:

我在使用 Qt5.10.0 时遇到了类似的问题

qmake CONFIG+=debug
make
lldb ./debug/qt_test.app/Contents/MacOS/qt_test
(lldb) env DYLD_IMAGE_SUFFIX=_debug
(lldb) image list
...
[ 16] 9A8C46A9-CADB-3DC2-9D5A-E04826477DCB 0x0000000000000000 /Users/macmini/Qt5.10.0/5.10.0/clang_64/lib/QtWidgets.framework/Versions/5/QtWidgets
 /Users/macmini/Qt5.10.0/5.10.0/clang_64/lib/QtWidgets.framework.dSYM/Contents/Resources/DWARF/QtWidgets
...

dSYM 似乎已加载,但不适用于 Qt 库的 _debug 版本。但是当我在 lldb 中运行应用程序时:

(lldb) b main
(lldb) r
... lldb breaks on main()...
(lldb) image list
...
[  9] 1292D5A0-4ADF-37C3-A724-DDB9B199EE8A 0x0000000100296000 /Users/macmini/Qt5.10.0/5.10.0/clang_64/lib/QtWidgets.framework/Versions/5/QtWidgets_debug 
      /Users/macmini/Qt5.10.0/5.10.0/clang_64/lib/QtWidgets.framework.dSYM/Contents/Resources/DWARF/QtWidgets_debug
...

现在它使用带有正确符号的 _debug Qt 库。 调试愉快!

【讨论】:

我可以确认运行后加载了正确的版本。谢谢!

以上是关于LLDB - Qt 缺少调试信息的主要内容,如果未能解决你的问题,请参考以下文章

Rust LLDB 调试入门指北

在 LLDB 中获取有关坏内存地址的信息

在lldb调试中调用c++函数

iOS逆向工程之使用LLDB的USB连接调试第三方App

xcode调试

在Android与iOS中使用LLDB调试Rust程序