将调试中的QUrl可视化为VS中的字符串
Visualize QUrl in debug as string in VS
一般来说,我喜欢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<QString*>(reinterpret_cast<char*>(d) + 8)->d->size">{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d) + 8)}://{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d) + 20)}{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d) + 24)}</DisplayString>
<DisplayString>{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d) + 24)}</DisplayString>
<Expand>
<Item Name="[scheme]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(d) + 8)</Item>
<Item Name="[host]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(d) + 20)</Item>
<Item Name="[path]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(d) + 24)</Item>
<Item Name="[query]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(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<QString*>(reinterpret_cast<char*>(d)
+ 4+4)->d->size">{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4+4)}://{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4*2+8*3)}{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4*2+8*4)}</DisplayString>
<DisplayString>{*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4*2+8*4)}</DisplayString>
<Expand>
<Item Name="[scheme]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4+4)</Item>
<Item Name="[host]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4*2+8*3)</Item>
<Item Name="[path]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4*2+8*4)</Item>
<Item Name="[query]">*reinterpret_cast<QString*>(reinterpret_cast<char*>(d)
+ 4*2+8*5)</Item>
</Expand>
</Type>
</AutoVisualizer>
相关文章:
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 返回空字符串文字 VS. 返回空点 - 它们是一样的吗?
- 返回字符串vs通过引用传递字符串以更新值
- 如何在 C++ VS 中使用原始字符串文字(编码问题)
- 代码 c++ VS 2010 中的 LPCWSTR 到字符串转换问题
- VS 静态字符串是否可写
- 调用具有字符串参数direct vs variable的函数
- (视觉-)C++ 字符串文本的模板类型推断 - VS 2010 与 VS 2017
- VS 在打印字符串数组元素 - c++ 时中止
- VS 链接器失败,标准::字符串方法出现"object already exists"错误
- Win32 API VS C++;要字符串的文本框内容
- 在 VS 调试器中显示 UTF-16 字符串
- 将调试中的QUrl可视化为VS中的字符串
- C 字符串的长度:std::strlen() vs. std::<char>char_traits::length()
- 性能标准::strstr vs. 标准::字符串::查找
- 如何在VS调试器中查看c++中动态字符串数组的内容
- std::mutiset vs std::vector,用于读取排序字符串并将其写入文件
- VS2010上不区分大小写的字符串比较-为每个版本的VS播放#if定义的语句
- 在c++中传递字符串给函数(对象vs字符串)
- 字符串 s = "hello" vs 字符串 s[5] = { "hello" }