将调试中的QUrl可视化为VS中的字符串

Visualize QUrl in debug as string in VS

本文关键字:VS 字符串 QUrl 调试 可视化      更新时间:2023-10-16

一般来说,我喜欢QUrls,但在代码中有很多QUrls的情况下调试代码是很痛苦的,而且我在调试中看不到实际的url字符串,我不得不在代码中对toString进行一些调试调用。有没有可能让它在调试监视中可见?

我知道这很旧,但我自己刚刚偶然发现了这个问题,并决定以某种方式解决它。至少可以说,解决方案是粗糙的,但它是有效的。

QUrl的问题是它的所有内部都使用了pimpl,并且在调试时无法访问QUrlPrivate的定义。一旦QUrl中的任何内容发生更改,这里的解决方案可能会中断,因为它是基于QUrlPrivate成员的偏移量。所以,如果在未来的版本中出现任何问题,你可以调整偏移,你就很好了。这是自问题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 DocumentsVisual Studio 2013VisualizersQUrl.natvis

希望它对某人有用。

编辑:

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

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

你可以在你的电脑上添加你自己的漂亮图案,看看QT是如何做到的。

natvis文件添加了这种功能。

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

64位版本Visual Studio 2017和Qt 5.12.9的@W.B.答案有更新。只更改了偏移量。

<?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>