3

Visual Studio 2015 の natvis 拡張機能に問題があります。私の努力では、マップにアクセスする必要がありTreeItemsますが、natvis のノードが機能していないようです。私は実際にサンプルコードを使用しています:

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

  <Type Name="std::map&lt;*&gt;">
    <DisplayString>{{size = {_Mysize}}}</DisplayString>
    <Expand>
      <Item Name="[size]">_Mysize</Item>
      <Item Name="[comp]">comp</Item>
      <TreeItems>
        <Size>_Mysize</Size>
        <HeadPointer>_Myhead-&gt;_Parent</HeadPointer>
        <LeftPointer>_Left</LeftPointer>
        <RightPointer>_Right</RightPointer>
        <ValueNode Condition="!((bool)_Isnil)">_Myval</ValueNode>
      </TreeItems>
    </Expand>
  </Type>
</AutoVisualizer>

しかし、マップ <int,int> でこのエラーが発生します。

Error: Function std::_Tree_comp_alloc<std::_Tmap_traits<int,int,std::less<int>,std::allocator<std::pair<int const ,int> >,0> >::_Mysize has no address, possibly due to compiler optimizations.
    Error while evaluating '_Mysize' in the context of type 'Program.exe!std::map<int,int,std::less<int>,std::allocator<std::pair<int const ,int> > >'.

デバッグ モードでビルドしており、最適化が無効になっていることを再確認しました (\Od)

msvc2015 の natvis 定義が変更された可能性がありますが、何も見つかりませんでした。サンプル コードは機能しないはずですが、機能しない例から作業を開始するのは難しいと思います。

4

1 に答える 1

1

std::map の実装が変更され、natvis の例が最新ではないと思います。

以下は、Visual Studio 2017で私のために働いています:

<Type Name="std::map&lt;*&gt;">
    <DisplayString>{{size = {_Mypair._Myval2._Myval2._Mysize}}}</DisplayString>
    <Expand>
      <Item Name="[size]">_Mypair._Myval2._Myval2._Mysize</Item>
      <Item Name="[comp]">_Mypair</Item>
      <Item Name="[first element]">_Mypair._Myval2._Myval2._Myhead</Item>
      <TreeItems>
        <Size>_Mypair._Myval2._Myval2._Mysize</Size>
        <HeadPointer>_Mypair._Myval2._Myval2._Myhead-&gt;_Parent</HeadPointer>
        <LeftPointer>_Left</LeftPointer>
        <RightPointer>_Right</RightPointer>
        <ValueNode Condition="!((bool)_Isnil)">_Myval</ValueNode>
      </TreeItems>
    </Expand>
  </Type>
于 2017-07-03T20:25:46.103 に答える