当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/318951.html

相关文章:

  • CVE-2019-5782:kArgumentsLengthType 设置偏小导致优化阶段可以错误的去除 CheckBound 节点
  • uni-app微信小程序上拉加载,下拉刷新
  • HTML案例-2.标签综合练习
  • C++中的多值返回:解锁函数返回值的神奇力量
  • D咖智能咖啡机:营业利器,品质与效率的完美结合
  • 江科大stm32学习笔记【6-2】——定时器定时中断定时器外部时钟
  • go优雅重试
  • Python最常用的库
  • C++面试100问(八)
  • 【Git】Github 上commit后,绿格子contribution却不显示?不知道怎么弥补?解决方法在这里
  • 【Vue3】源码解析-Runtime
  • 常见面试题之计算机网络
  • C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)
  • 【Hadoop大数据技术】——MapReduce经典案例实战(倒排索引、数据去重、TopN)
  • 02、字面量与变量
  • docker的常用指令
  • 19 OpenCV 霍夫曼变换检测圆
  • leetcode代码记录(摆动序列
  • django学习笔记
  • Python环境安装及Selenium引入
  • 【gpt实践】实用咒语分享
  • Linux用户和权限
  • git svn混用
  • FPGA静态时序分析与约束(三)、读懂vivado时序报告
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Badge)
  • Python程序设计基础——代码习题
  • 代码随想录 贪心算法-中等题目-序列问题
  • pytest生成allure的报告
  • Python控制摄像头并获取数据文件
  • 免费分享一套SpringBoot+Vue自习室(预约)管理系统,帅呆了~~