【问题标题】:Visualize QUrl in debug as string in VS将调试中的 QUrl 可视化为 VS 中的字符串
【发布时间】:2013-12-22 11:08:22
【问题描述】:

一般来说,我喜欢 QUrls,但是调试代码中包含大量 QUrls 的代码非常痛苦,而且我在调试中看不到实际的 url 字符串,我必须在代码中对 toString 进行一些调试调用。有没有可能让它在调试手表中可见?

【问题讨论】:

    标签: c++ visual-studio qt debugging


    【解决方案1】:

    我知道这已经过时了,但我自己偶然发现了这个问题并决定以某种方式解决它。该解决方案至少可以说是粗略的,但它确实有效。

    QUrl 的问题在于它的所有内部都使用 pimpl 并且在调试时您无权访问 QUrlPrivate 的定义。一旦 QUrl 中的任何内容发生更改,此处的解决方案可能会中断,因为它基于 QUrlPrivate 成员的偏移量。因此,如果将来的版本中有任何问题,您可以调整偏移量,这很好。这是从 Qt 5.3.1 开始的

    <?xml version="1.0" encoding="utf-8"?>
    <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
    
        <Type Name="QUrl">
            <DisplayString Condition="reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 8)->d->size">{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 8)}://{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 20)}{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 24)}</DisplayString>
            <DisplayString>{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 24)}</DisplayString>
            <Expand>
                <Item Name="[scheme]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 8)</Item>
                <Item Name="[host]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 20)</Item>
                <Item Name="[path]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 24)</Item>
                <Item Name="[query]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 28)</Item>
            </Expand>
        </Type>
    
    
    </AutoVisualizer>
    

    只需将其保存到(例如):

    %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers\QUrl.natvis

    希望它对某人有用。

    编辑:

    这假设您安装了其他 Qt 类型的 natvis,尤其是 QString

    【讨论】:

    • 天哪,为什么 Qt Vs 工具中没有包含这些内容。你刚刚拯救了我的一天。
    • VS2015 的路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers
    【解决方案2】:

    看起来 QT VS 插件为 VS 2012 添加了漂亮的打印支持。 从here获取它

    您可以在see how QT does it 上添加您自己的漂亮打印。

    natvis 文件添加了此功能。

    ** 编辑 ** Qt 的 VS Addin 附带的 natvis 文件仅声明 QUrl,但没有添加打印所需的 natvis 代码。有兴趣的用户可以修改这个文件,添加QUrl查看功能。

    【讨论】:

    • QT VS 插件添加了对 QUrls 不起作用的漂亮打印支持,它仍然在调试中看到而不是字符串。在 natvis 文件中,它看起来像 &lt;DisplayString Condition="d.type == QMetaType::QUrl"&gt;Url&lt;/DisplayString&gt; 我应该改变什么?
    • 那太糟糕了。在Qt5.natvis 中有一个声明,但没有关于如何显示 URL 字符串的内部信息。见here
    • 您可以在 natvis 文件中查看其他示例。 VS 附带的其他 natvis 文件(例如,用于 STL 和 MFC),它们也可以用作参考。
    【解决方案3】:

    @W.B. 有更新。 answer 适用于 64 位版本的 Visual Studio 2017 和 Qt 5.12.9。仅更改了偏移量。

    <?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
    
        <Type Name="QUrl">
            <DisplayString Condition="reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4+4)->d->size">{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4+4)}://{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4*2+8*3)}{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4*2+8*4)}</DisplayString>
            <DisplayString>{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4*2+8*4)}</DisplayString>
            <Expand>
                <Item Name="[scheme]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4+4)</Item>
                <Item Name="[host]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4*2+8*3)</Item>
                <Item Name="[path]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4*2+8*4)</Item>
                <Item Name="[query]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d)
    + 4*2+8*5)</Item>
            </Expand>
        </Type>
    
    
    </AutoVisualizer>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 2023-03-11
      • 2021-11-15
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多