华夏名网网站管理助手,阿里邮箱登录入口,网站如何备案流程,事件营销在Mac下使用Xcode 开发Qt程序#xff0c;由于程序断点或者崩溃后#xff0c;Qt库的堆栈并不能够正确定位到源码的cpp文件#xff0c;而是显示的是汇编代码#xff0c;导致不直观的显示。 加载的其他三方库都是同理。 所以找了攻略和研究后#xff0c;写的这篇文章。
一由于程序断点或者崩溃后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补充说明
这里可以使用 settings append target.source-map oldpath newpath 这个命令这样我们就不会覆盖而是添加到列表里面。 比如我们 可以设置 不同的Qt 版本映射到同一个路径这样我们运行不同版本的Qt都能够正确符号化文件(没有验证)。 可以看出 /Users/qt/work/qt 被映射到了 两个版本的Qt源码路径。如果直接运行 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