环境:
- MacOS: 14.3
- Xcode: Version 15.0
- Qt:Qt 6.5.3
前言
Xcode
中显示 预览 QString
特别不方便, 而Qt
官方的 lldb
脚本debugger/lldbbridge.py
一直加载失败,其他第三方的脚本都 不兼容当前的 环境。所以自己研究写了当前的教程。
当前方法同样适用于其他非 苹果内置类型的预览和显示。
原始效果如下:
优化后的效果:
创建步骤:
- 检测
~/.lldbinit
文件
判断文件是否存在,不存在则创建。
每次 lldb 启动都会 加载~/.lldbinit
文件的命令,可以理解为存在硬盘里面的默认用户配置。 - 创建 python 脚本文件
在任意路径创建一个python 文件。 我这里创建的python文件的路径为:~/Documents/source/PYTest/lldb_qt_value.py
~/.lldbinit
写入命令
这里lldb 在初始化的时候就会导入 这个python文件# 加载 lldb 预览 qt 内置成员的 脚本 command script import '~/Documents/source/PYTest/lldb_qt_value.py'
- 回到
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
类型被预览时(或者控制台输入po
或p
命令) 会进入这个函数QString_summary
- 获取我们准备替换显示的值, 获取路径为
test1 -> d -> ptr -> summary.
具体对应这个代码summary = value.GetChildMemberWithName('d').GetChildMemberWithName('ptr').GetSummary()
- 判断如果是空的 就返回 NULL
- 不为空则 去除 前面两个字符
u"
和最后 一个"
。 从u"ABC测试"
->ABC测试
- 返回处理后的值,供lldb 预览显示
结果
QString
和 std::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