Xcode调试Qt 源码

在Mac下使用Xcode 开发Qt程序,由于程序断点或者崩溃后,Qt库的堆栈并不能够正确定位到源码的cpp文件,而是显示的是汇编代码,导致不直观的显示。

加载的其他三方库都是同理。

所以找了攻略和研究后,写的这篇文章。

一:最终效果:

一个空白的Qt程序。

在Xcode运行后,暂停的堆栈如下:QEventLoop 文件是汇编显示的。

最终处理后,显示的堆栈已经正确符号化了

二:具体步骤

0.准备工作

  • Qt 库文件
  • Qt DSYM 文件 (这里貌似分为Debug和Release两种,debug才可以调试,但是Qt 维护程序下载的就是debug版本,所以没有问题)
  • Qt 对应的源码文件
    三者必须完全对应,才能解析出正确的内容。


1. 暂停程序,在lldb控制台输入 image list QtCore

这里image list QtCore 是直接指定QtCore 来查看,也可以直接image list 查看当前程序加载的所有库。

红线分别代表加载的动态库 和 对应的 DSYM符号文件。

说明我们的Qt程序是有符号文件的,但是为什么我们符号文件加载后不能直接找到我们的源代码路径呢?而 QtCore 这个动态库就能够找到自己对应的符号文件。

之所以动态库能够找到符号文件是因为 下载的 动态库和符号文件是放在一起的,Xcode加载的时候就直接找到了。

而DSYM和源代码并没有放在一起,Qt在编译打包的时候,DSYM应该记录的当时打包机的源代码的绝对路径,而我们的电脑里面源代码的绝对路径和Qt打包机的路径不一致导致找不到。

苹果爸爸的说明如下:
简要意思就是说,你的三方库不是你自己电脑打包的话,那么需要告诉 debugger 你本地的路径来替换打包机的路径

2. 查找 源代码路径

我们选中断点的 14 栈帧QEventLoop::processEvents(....) .

输入 source info 命令

或者在任意断点位置指定输入:source info -n QEventLoop::processEvents

指定查找QEventLoop::processEvents()这个函数。最终效果也一样。

最终指向的查找的源码也都是: /Users/qt/work/qt/qtbase/src/corelib/kernel/qeventloop.cpp

然鹅这个路径在我们电脑上并不存在。

我们自己的代码是存放在别的地方的。

3. 重定位到 本机的 源代码路径

3.1 首先我们 使用 命令查找 本地的 路径映射

复制代码
settings show target.source-map

不出意料,一个映射都没有。

3.2 重绑定 映射关系

复制代码
settings set target.source-map /Users/qt/work/qt/ /Users/jimbo/Qt/6.5.3/Src/

改名了后将 /Users/qt/work/qt/ 进行 /Users/jimbo/Qt/6.5.3/Src/ 替换。

这样我们 就将 Qt打包机的路径前缀替换成我们本机的了。

再次运行这个命令,查看映射关闭。

复制代码
settings show target.source-map

补充说明:

  1. 这里可以使用 settings append target.source-map <oldpath> <newpath> 这个命令,这样我们就不会覆盖,而是添加到列表里面。
    比如我们 可以设置 不同的Qt 版本映射到同一个路径,这样我们运行不同版本的Qt都能够正确符号化文件(没有验证)。

    可以看出 /Users/qt/work/qt 被映射到了 两个版本的Qt源码路径。
  2. 如果直接运行 settings show 会打印出 所有的配置的变量

3.3 验证效果

重新进入断点,触发了 lldb的重新加载。或者下一步调试也是可以的。

这里可以看出代码区已经能够显示出正确的Qt源码了。

三:遗留问题

  • map 映射不能保存,App重启后就失效了,每次都需要在lldb里面进行配置。需要继续研究。

参考:
apple
https://lldb.llvm.org/use/map.html

https://blog.csdn.net/u011388696/article/details/120794111

相关推荐
机器视觉知识推荐、就业指导4 小时前
Qt 6 所有 QML 类型(官方完整清单 · 原始索引版)
开发语言·qt
少控科技5 小时前
QT新手日记033
开发语言·qt
REDcker9 小时前
macOS「系统数据」暴涨到 几百GB?一篇文章教你安全清理(含排查顺序)
macos
sysinside9 小时前
macOS Sequoia 15.7.2 (24G325) 正式版 ISO、IPSW、PKG 下载
macos·sequoia
只是有点小怂9 小时前
macOS 没有像 Windows 上的 MobaXterm 的工具
macos
小雨青年11 小时前
环境准备 Windows Mac 下 Docker Desktop 的安装与镜像源加速
windows·macos·docker
少控科技11 小时前
QT新手日记 030
开发语言·qt
数据知道11 小时前
一文掌握 MongoDB 详细安装与配置(Windows / Linux / macOS 全平台)
linux·数据库·windows·mongodb·macos
知1而N11 小时前
电脑上运行APK文件(Android应用程序包),需要借助特定的软件或功能,因为Windows/macOS/Linux系统无法原生直接运行安卓应用
android·macos·电脑