当前位置: 代码网 > it编程>编程语言>C/C++ > MacOS Xcode 使用LLDB调试Qt的 QString

MacOS Xcode 使用LLDB调试Qt的 QString

2024年07月28日 C/C++ 我要评论
Xcode中显示 预览QString特别不方便, 而Qt官方的lldb脚本一直加载失败,其他第三方的脚本都 不兼容当前的 环境。所以自己研究写了当前的教程。当前方法同样适用于其他非 苹果内置类型的预览和显示。

环境:

  • 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 none
    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 类型或者 自定义类型都可以用此方法 显示。

在这里插入图片描述
最终脚本预览如下:
加上 qbytearray 的自定义显示后:

import lldb

#command script import '~/documents/source/pytest/lldb_qt_value.py'

def qbytearray_summary(value, internal_dict):
    if value is none:
        return none
    return value.getchildmemberwithname('d').getchildmemberwithname('ptr').getsummary()

def qstring_summary(value, internal_dict):
    summary = value.getchildmemberwithname('d').getchildmemberwithname('ptr').getsummary()
    if summary == "summary unavailable":
        return none
    return summary[2:-1]

# lldb 的 默认初始化 函数
def __lldb_init_module(debugger, internal_dict):
    debugger.handlecommand('type summary add qstring -f lldb_qt_value.qstring_summary')
    debugger.handlecommand('type summary add qbytearray -f lldb_qt_value.qbytearray_summary')
    print('lldb_qt_value.py 正在为您服务.')

在这里插入图片描述

参考

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com