正如你们大多数人所知,Windbg可以用于调试程序,但现在我想做相反的事情:我想调试我在Windbg中正在做的事情,让我告诉你们为什么:
我发现了一个有趣的本地可视化程序,包含以下条目:
<Type Name='CMap<*,*,*,*>'>
<AlternativeType Name="CMapStringToString"/>
<AlternativeType Name="CMapStringToPtr"/>
<DisplayString>{{size = {m_nCount} }}</DisplayString>
<Expand>
<CustomListItems>
<Variable Name='pHashtable' InitialValue='m_pHashTable'/>
<Variable Name='hashtable_index' InitialValue='0'/>
<Variable Name='pList' InitialValue='*m_pHashTable'/>
<Variable Name='i' InitialValue='0'/>
<Loop Condition='hashtable_index < m_nHashTableSize'>
<Exec>pList = pHashtable[hashtable_index]</Exec>
<Loop Condition='pList '>
<Item Name='{i}: [{pList->key}]'>pList->value</Item>
<Exec>pList = pList->pNext</Exec>
<Exec>++i</Exec>
</Loop>
<Exec>++hashtable_index</Exec>
</Loop>
</CustomListItems>
</Expand>
</Type>
<Type Name='CMap<*,*,*,*>' IncludeView='keys'>
<AlternativeType Name="CMapStringToString::CAssoc"/>
<AlternativeType Name="CMapStringToPtr::CAssoc"/>
<DisplayString>{{size = {m_nCount} }}</DisplayString>
<Expand>
<CustomListItems>
<Variable Name='pHashtable' InitialValue='m_pHashTable'/>
<Variable Name='hashtable_index' InitialValue='0'/>
<Variable Name='pList' InitialValue='*m_pHashTable'/>
<Variable Name='i' InitialValue='0'/>
<Loop Condition='hashtable_index < m_nHashTableSize'>
<Exec>pList = pHashtable[hashtable_index]</Exec>
<Loop Condition='pList '>
<Item Name='[{i}].key:'>pList->key</Item>
<Item Name=' [{i}].value:'>pList->value</Item>
<Exec>pList = pList->pNext</Exec>
<Exec>++i</Exec>
</Loop>
<Exec>++hashtable_index</Exec>
</Loop>
</CustomListItems>
</Expand>
</Type>
这些条目确保CMap对象以一种很好的方式显示,一个在另一个下面。与另一个内部条目一起,这在Visual Studio监视窗口中给出了以下结果:
0x000000005b9c95d0 Element L"Element1" (ID1/SubID1.1, L"interesting_information.1"/L"1.0.0.0")
0x0000000059484d20 Element L"Element2" (ID1/SubID1.2, L"interesting_information.2"/L"2.0.0.0")
0x000000004caa6110 Element L"Element3" (ID2/SubID2.1, L"interesting_information.3"/L"3.0.0.0")
...
(this goes until the end of the CMap)
当我尝试在Windbg中执行同样的操作时(使用dx
命令(,这会给出类似的信息,但它在条目号49处结束:
Windbg Prompt>dx -r1 (*((<application>!CMap<unsigned __int64,unsigned __int64,CElement *,CElement *> *)0x13fbd2ae0))
[" [0].value:"] : 0x6dce7fd0 [Type: CElement *]
["[1].key:"] : 0x7984000007a3 [Type: unsigned __int64]
[" [1].value:"] : 0x5b9c95d0 [Type: CElement *]
["[2].key:"] : 0x79840000053f [Type: unsigned __int64]
...
[" [49].value:"] : 0x1bab05b0 [Type: CElement *]
[...] [Type: CMap<unsigned __int64,unsigned __int64,CElement *,CElement *>]
(通过点击条目,我获得了更多信息,这些信息由提到的其他本地可视化器条目正确呈现(
我想知道CMap
条目的显示在49处停止的原因。我已经知道我可以通过单击...
(它将-c 100
、-c 200
…添加到dx
命令中(获得更多条目,但如果我可以获得更多信息(比如Visual Studio的输出窗口,其中选项"Debugging,output window,General output Settings,Natvis diagnostics messages"设置为"Verbose"(,我就可以诊断并解决我的问题。
有人知道怎么做吗
提前感谢
目前,WinDbg中没有类似于Visual Studio的"扩展诊断"可用于NatVis。
也就是说,默认情况下,"dx"命令将显示任何容器的前100个条目,并显示用于继续的DML链接([…](。如果您想要100个以上的条目,可以使用格式说明符来指示要显示的条目数量(这些与Visual Studio相同(。
例如:
dx <container expression>,1000
将显示1000个条目,而不是默认的100个条目。
windbg可以调试windbg子代windbg调试实际的二进制
iirc被称为菊花旋转
打开命令提示符
键入windbg-wwindbg-app并点击回车
如果你不介意使用控制台版本,windbg有一个内置的命令
.dbgdbg
这将为现有实例生成一个父调试器