【问题标题】:View QObject's objectName in Visual Studio Debugger在 Visual Studio 调试器中查看 QObject 的 objectName
【发布时间】:2021-10-24 23:35:56
【问题描述】:

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

背景:

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

更多详情:

  • 我使用的是 Qt 5.9.3 和 Visual Studio 2019
  • 我已经为 Visual Studio 安装了 qt5.natvis(它不会为您执行此操作)
  • 我要求至少有一个可以工作的监视表达式,它可以粘贴到调试器中,用于带有 objectName 的任何本地 QObject 派生变量,以便显示其 objectName。
  • 理想的答案还包括更新后的qt5.natvis,它显着地公开了任何本地QObject 派生变量的objectName。

【问题讨论】:

    标签: c++ visual-studio qt debugging visual-studio-debugging


    【解决方案1】:

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

    解决方案是为您感兴趣的类型编写或查找“原生可视化工具”(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();
    }
    

    【讨论】:

    • 嗨,我已经安装了qt5.natvis 文件。根据我的经验(Qt 5.9.3),它不允许查看objectName。因此我无法将此答案标记为正确。
    • @PatrickParker 不知道可以直接参考D-Pointer吗?喜欢yourObj.d_ptr->objectName
    • 我也想知道这个,所以我的问题。 :) 说真的,我已经浏览了 var 内容的整个层次结构,找不到任何类似于 QString 成员的东西。如果没有应答者来救我,我可能会深入研究 QObject 源代码以找出它的存储位置。
    • @PatrickParker 请查看我对源代码的更新答案
    • QObject 类中没有成员d。那是函数调用的结果。我确实看到了一个 d_ptr。我可以写myObj->d_ptr,但我不能写myObj->d_ptr->extraData。如果您认为它已得到解答,请在带有 Qt 的调试器中亲自查看。我只会考虑提供有效观察表达式的答案。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      相关资源
      最近更新 更多