在 Visual Studio 调试器中查看 QObject 的 objectName

View QObject's objectName in Visual Studio Debugger

不幸的是,QObject 没有像人们预期的那样在调试器中可见的 QString m_objectName 成员。相反,所有的实现数据都隐藏在不透明的指针后面。有什么方法可以在运行时从 Visual Studio 调试器中查看 objectName 吗?

背景:

调试 Qt 应用程序时,特定 QObject 的实例可能有很多,可能很难知道是哪个实例触发了崩溃,因为该信息可能在调用堆栈中不可用。然而,如果它们都被赋予了唯一的 objectNames,理论上可以让人们快速查明有问题的代码区域。

更多详情:

调试器不能(不应该?)为了显示目的调用对象的成员函数,因为它可能有副作用。

解决方案是为您感兴趣的类型编写或查找“原生可视化工具”(natvis)。

幸运的是,Qt 人做到了:https://wiki.qt.io/IDE_Debug_Helpers

您可以按照此文档做更好的自定义工作:https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2019

这可能指向数据成员名称(来自qobject.cpp) :

QString QObject::objectName() const
{
    Q_D(const QObject);
    return d->extraData ? d->extraData->objectName : QString();
}

假设是Debug构建(Qt5Cored.dll),添加一个变量watch如下:

((Qt5Cored.dll!QObjectPrivate*)myQtObj->d_ptr.d)->extraData->objectName
  • 将“myQtObj”更改为您希望检查的相关 QObject*(或派生 class 扩展 QObject)的局部变量名称

为了开发人员的方便,我将把如何将其添加到 qt5.natvis 作为未来的练习,或者其他回答者可能希望提供该信息。