如何在Visual Studio调试器中查看Qt QObject的objectName属性
Visual Studio调试Qt 5.9.3时查看QObject的objectName方案
核心原理
Qt 5的QObject所有私有实现数据都存储在d_ptr指针指向的QObjectPrivate实例中,该私有类内部包含QString类型的objectName成员,只要通过d_ptr获取到私有类的裸指针,即可读取到对象名称。
1. 即时可用的监视表达式
直接将对应表达式粘贴到VS调试器的监视窗口即可查看:
- 若要查看的是QObject派生类指针变量(例如
QObject* myObj),使用表达式:((QObjectPrivate*)((*(void**)myObj)))->objectName - 若要查看的是栈上分配的QObject派生类实例(例如
QWidget myWidget),使用表达式:((QObjectPrivate*)((*(void**)&myWidget)))->objectName
如果调试时提示QObjectPrivate类型未识别,可使用硬编码偏移版本(Qt 5.9.3专属,64位程序偏移为0x28,32位程序偏移为0x14),以64位指针为例:*(QString*)((char*)(*(void**)myObj) + 0x28)
2. 自定义natvis配置实现自动显示
无需每次手动输入监视表达式,修改natvis配置后所有QObject派生类都会自动展示objectName:
- 打开VS用户可视化配置目录:
C:\Users\<你的系统用户名>\Documents\Visual Studio 2019\Visualizers - 新建名为
Qt5_ObjectName.natvis的文件,写入以下内容:
<?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> <!-- 匹配QObject基类 --> <Type Name="QObject"> <DisplayString>{{objectName={((QObjectPrivate*)d_ptr.d)->objectName}}}</DisplayString> <Expand> <Item Name="objectName">((QObjectPrivate*)d_ptr.d)->objectName</Item> </Expand> </Type> <!-- 低优先级匹配所有QObject派生类,不影响其他自定义类型的natvis规则 --> <Type Name="*" Priority="Low"> <Condition>IsDerivedFrom("QObject", $T1)==true</Condition> <DisplayString>{{objectName={((QObjectPrivate*)((*(void**)&$this)))->objectName}}}</DisplayString> </Type> </AutoVisualizer>
- 保存文件后重启Visual Studio即可生效,调试时所有QObject派生类变量的预览栏会直接显示objectName的值。
内容的提问来源于stack exchange,提问作者Patrick Parker
相关产品推荐
相关产品推荐

