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

MacOS Xcode 使用LLDB调试Qt的 QString

环境:

  • MacOS: 14.3
  • Xcode: Version 15.0
  • Qt:Qt 6.5.3

前言

Xcode 中显示 预览 QString 特别不方便, 而Qt官方的 lldb 脚本debugger/lldbbridge.py一直加载失败,其他第三方的脚本都 不兼容当前的 环境。所以自己研究写了当前的教程。
当前方法同样适用于其他非 苹果内置类型的预览和显示。

原始效果如下:
在这里插入图片描述
优化后的效果:
在这里插入图片描述

创建步骤:

  1. 检测 ~/.lldbinit 文件
    判断文件是否存在,不存在则创建。
    每次 lldb 启动都会 加载 ~/.lldbinit 文件的命令,可以理解为存在硬盘里面的默认用户配置。
  2. 创建 python 脚本文件
    在任意路径创建一个python 文件。 我这里创建的python文件的路径为:~/Documents/source/PYTest/lldb_qt_value.py
  3. ~/.lldbinit 写入命令
    这里lldb 在初始化的时候就会导入 这个python文件
    # 加载 lldb 预览 qt 内置成员的 脚本
    command script import '~/Documents/source/PYTest/lldb_qt_value.py'
    
  4. 回到 lldb_qt_value.py 文件,写具体脚本
import lldb

def QString_summary(value, internal_dict):
    summary = value.GetChildMemberWithName('d').GetChildMemberWithName('ptr').GetSummary()
    if summary == "Summary Unavailable":
        return "NULL"
    return summary[2:-1]

# lldb 的 默认初始化 函数
def __lldb_init_module(debugger, internal_dict):
    debugger.HandleCommand('type summary add QString -F lldb_qt_value.QString_summary')
    print('lldb_qt_value.py 正在为您服务.')

具体逻辑如下:

  • lldb 初始化调用 __lldb_init_module 函数
  • 创建一个 QString 的钩子函数。函数为 lldb_qt_value 文件的 QString_summary方法。
  • 初始化 会在控制台打印 'lldb_qt_value.py 正在为您服务.'
    在这里插入图片描述
  • QString 类型被预览时(或者控制台输入 pop 命令) 会进入这个函数QString_summary
  • 获取我们准备替换显示的值, 获取路径为test1 -> d -> ptr -> summary.
    具体对应这个代码 summary = value.GetChildMemberWithName('d').GetChildMemberWithName('ptr').GetSummary()
    在这里插入图片描述
  • 判断如果是空的 就返回 NULL
  • 不为空则 去除 前面两个字符 u" 和最后 一个 "。 从u"ABC测试" -> ABC测试
  • 返回处理后的值,供lldb 预览显示

结果

QStringstd::vector<QString> 和 其他包含QString的类型都可以正确格式化。
如果需要其他 Qt 类型或者 自定义类型都可以用此方法 显示。

在这里插入图片描述
最终脚本预览如下:
在这里插入图片描述

参考

https://lldb.llvm.org/use/variable.html
https://lldb.llvm.org/python_api/lldb.SBValue.html


http://www.kler.cn/a/274652.html

相关文章:

  • RunCam WiFiLink连接手机图传测试
  • 轻松上手:使用 Vercel 部署 HTML 页面教程
  • 在 Spring Boot 3 中实现基于角色的访问控制
  • 【Java基础面试题024】Java中包装类型和基本类型的区别是什么?
  • cenos如何升级git到2以上版本
  • 【AI驱动的数据结构:包装类的艺术与科学】
  • 使用华为云HECS服务器+nodejs开启web服务
  • Flutter-底部弹出框(Widget层级)
  • 20240319在WIN10下给K6000按照驱动程序
  • MySQL 搭建双主复制服务 并 通过 HAProxy 负载均衡
  • 动态规划练习第一天
  • Java 设计模式系列:行为型-状态模式
  • 智能合约语言(eDSL)—— 使用rust实现eDSL的原理
  • 鸿蒙开发实战:【系统服务管理部件】
  • 多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型
  • 基于springboot+vue的智慧生活商城系统
  • Stability AI 3D:开创3D视觉技术新篇章,提升多视角连贯性与生成质量
  • 杰发科技AC7801——Flash数据读取
  • 静态页面负载均衡
  • 【NLP笔记】Transformer
  • 多数据源 - dynamic-datasource | 集成 HikariCP 连接池
  • 安卓面试题多线程 96-100
  • es 集群安全认证
  • 【SpringSecurity】十三、基于Session实现授权认证
  • 使用OpenRewrite自动做框架升级比如Spring Boot
  • Siloed No More: How AI-Driven Tech Stack Consolidation Boosts Revenue