web-dev-qa-db-ja.com

Visual Studio 2015でのSTLコンテナーの検査

Visual Studio Enterprise 2015バージョン14.0.23107.0 D14RELを実行しています。

C++プログラムをデバッグするとき、STLコンテナの内容が表示されません。

[変数ウィンドウにオブジェクトの未加工構造を表示]オプションのチェックを外しました([ツール]、[オプション]、[デバッグ]、[全般])。

問題を説明する例を次に示します。

#include <list>
#include <string>
#include <vector>

int main()
{
    std::string string = "test";
    std::vector<int> vector{ 4, 5, 6 };
    std::list<std::string> list{ "one", "two", "three" };
    return 0;
}

[ローカル]ウィンドウまたは[ウォッチ]ウィンドウに次のように表示されます。

list         [...]()
vector       [...](...
  (error)    0
  (error)    0
string       {npos=4294967295}
  (error)    0
  (error)    0

次に、「Show raw structure ...」オプションをオンにすると、ベクターオブジェクトと文字列オブジェクトに正しくドリルダウンできますが、リストはまだできません。

私が見逃した別のオプションはありますか、これはVSの真のバグですか?

31
Graham Bull

同じ問題がありました。

[ツール]-> [オプション]-> [デバッグ]-> [全般]に移動し、[管理互換性モードを使用]と[ネイティブ互換性モードを使用]の両方をオフにする必要があります。

26

私は同じ問題を抱えていますが、デバッガタイプが「混合」の場合(またはプロジェクトにC++/CLIコードが含まれ、タイプが「自動」の場合のみ)。デバッガータイプが「ネイティブのみ」の場合、std :: vector全体とその単一要素の両方が正しく表示されます。

デバッガタイプ「ネイティブのみ」を使用して、混合プロジェクトの純粋なC/C++部分をデバッグできますが、C++/CLIコードにステップインすることはできません。

追加:ネイティブデバッガでの表示に問題がある場合は、https://msdn.Microsoft.com/en-us/library/jj620914.aspxをお読みください。

6
Eugene

「私のボックスで動作する」...最後に...やっと...でも、特にこれらのステップを実行しなければなりませんでした:

  1. インストール VS2015 Update 2 、約3時間かかります
  2. [ツール]から[管理互換モードを使用する]オプションと[ネイティブ互換モードを使用する]オプションの両方をオフにします。オプション|デバッグ
  3. "試してみる方法" に示されているように、このregスイッチを追加します。

登録キー:HKCU\Software\Microsoft\VisualStudio\14.0_Config\AD7Metrics\ExpressionEvaluator\{3A12D0B7-C26C-11D0-B442-00A0244A1DD2}\{994B45C4-E6E9-11D2-903F-00C04FA302A1} DWORDを追加LoadInShimManagedEEに設定0

これで標準コンテナを表示できます 私が前にやったことがないように 以前のバージョンで使用していたように。ネイティブC++コードのほとんどはC++/CLIコードから呼び出されるため、この修正は非常に必要です。

2
Chris O

いいえ、これはVisual Studioのバグではありません!

Microsoft Visual Studio 2005は、テンプレートクラスに使用できるデバッガビジュアライザーをサポートする最初のVisual Studioバージョンです。

実際には、std::<list>のビジュアライザーがありません

autoexp.datファイルにフォーマットルールを追加します。

ここでファイルを見つけることができます

%VSINSTALLDIR%\Common7\Packages\Debugger\autoexp.dat

[Visualizer]セクションに新しいルールを追加します。

例:リストサイズを表示するには

std::list<*,*>{
  preview
    (
      #("[list size=", $e._Mysize, "]")
    )
}

_Mysize実装のstd::<list>メンバーにアクセスしています。 _Mysizeは、リスト内の要素の数を示します。

パターン一致:

std::list<*,*>std::list<int>およびstd::list<int,std::allocator<int> >と一致します

std::list<*,*>std::list<string>およびstd::list<string,std::allocator<string> >と一致します

子アイテムを表示するには

std::list<*,*>{
  children
  (
    #(
      first item: $e._Myhead->_Next->_Myval,
      second item: $e._Myhead->_Next->_Next->_Myval,
      [third item]: $e._Myhead->_Next->_Next->_Next->_Myval
    )
  )
}

または偶数

std::list<*,*>{
  children
  (
    #list(size: $c._Mysize,
          head: $c._Myhead->_Next,
          next: _Next
    ) : $e._Myval
  )
}
1
user1

同じトラブルがありました。私の環境:10教授を獲得します。 x64、VS 2015、アップデート3、ツールセットv140、c ++プロジェクト。さらに文字列を見ることができませんでした。この問題は、更新または拡張によって導入されたようです。

解決策:VS2015を別のシステムに新規インストールしました(win 7 prof。x64)。これは、アップデート3(ネットインストール)でインストールされました。このマシンではすべて正常に動作しました。文字列を見ることができました(dbgツールチップを展開することなく)。コンテナの場合、移動時にサイズが表示され、要素を検査できます。パーフェクト。

違いはなんですか ?知りません。両方のマシンの.natvisファイルとC:\ Program Files(x86)\ Microsoft Visual Studio 14.0\Common7\Packages\Debugger\autoexp.datを比較しました

違いはありません。

そのため、このような場合の解決策は非常に一般的でした:VS2015をアンインストールします。 regクリーナーを実行します。再インストールします。開始。私の古い設定は最初のスタートから存在しており、デバッグ検査は再び機能しました。問題が解決しました。

0
nullptr

VS2015 SP3を実行しています。私はインターネットが私にそうするように言ったすべての修正を試みるのに2時間を費やしました。うまくいきませんでした!私の最後の手段はVSの再インストールでした(これには数時間かかります)。したがって、[プログラムの追加と削除]> [Microsoft Visual Studio Professional 2015]に移動しました。しかし、アンインストールする代わりに、「修復」を試みました。何が原因で問題が発生したのかわかりませんが、インストールを修復すると修正されました。

0
Jeff Lamb

VS2015では、リストのautoexp.datを次のように変更する必要がありました。

std::list<*>{
    preview (
        #(
            "[",
            $e._Mypair._Myval2._Mysize,
            "](",
        #list(
            head: $e._Mypair._Myval2._Myhead->_Next,
            size: $e._Mypair._Myval2._Mysize,
            next: _Next
        ) : $e._Myval,
            ")"
        )
    )  

    children (
        #list(
            head: $e._Mypair._Myval2._Myhead->_Next,
            size: $e._Mypair._Myval2._Mysize,
            next: _Next
        ) : $e._Myval
    )
}    

これらの変更は、VS2015 stl.natvisを検査し、<!-- VC 2015 -->でマークされたさまざまなデータ構造に加えられた変更に注意することから生じました。

他のstl構造にも適切な変更を加えましたが、すべてをテストしたわけではないことに注意してください

std::unique_ptr<*>{
    preview (
        #if ($e._Mypair._Myval2 == 0) (
            "empty"
        ) #else (
            #(
                "unique_ptr ",
                *$e._Mypair._Myval2
             )
        )
    )

    children (
        #if ($e._Mypair._Myval2 == 0) (
            #array(expr: 0, size: 0)
        ) #else (
            #([ptr] : $e._Mypair._Myval2)
        )
    )
}

std::_Bind<*>{
    preview (
        #(
            "bind(", $e._Mypair,
            ", ", $e._Mypair._Myval2,
            ")"
        )
    )

children (
        #(
            #([f] : $e._Mypair),
            #([bound_args] : $e._Mypair._Myval2)
            )
    )
}

std::_Mem_fn_wrap<*>{
    preview (
        ; We preview the functor returned by mem_fn() with "mem_fn(<stored member function pointer>)".
        #(
            "mem_fn(",
            $e._Pm,
            ")"
        )
    )

    children (
        ; Member function pointers have no children.
        #array(expr: 0, size: 0)
    )
}

std::_Func_impl<*>{
    preview ( $e._Mypair._Myval2 )
    children (
        #(
            #([functor] : $e._Mypair._Myval2),
            #([allocator] : $e._Mypair)
        )
    )
}

std::function<*>{
    preview (
        #if ($e._Mystorage._Ptrs[$e._Impl] == 0) (
            ; Detecting empty functions is trivial.
            "empty"
        ) #else (
            *$e._Mystorage._Ptrs[$e._Impl]
        )
    )

    children (
        #if ($e._Mystorage._Ptrs[$e._Impl] == 0) (
            ; We make empty functions appear to have no children.
            #array(expr: 0, size: 0)
        ) #else (
            #([functor and allocator] : *$e._Mystorage._ptrs[$e._Impl])
        )
    )
}
std::basic_string<char,*>{
    preview     ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,s] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,s] ))
    stringview  ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,sb] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,sb] ))

    children (
        #(
            #([size] : $e._Mypair._Myval2._Mysize),
            #([capacity] : $e._Mypair._Myval2._Myres),
            #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) (
                #array(expr: $e._Mypair._Myval2._Bx._Buf[$i], size: $e._Mypair._Myval2._Mysize)
            ) #else (
                #array(expr: $e._Mypair._Myval2._Bx._Ptr[$i], size: $e._Mypair._Myval2._Mysize)
            )
        )
    )
}
std::basic_string<unsigned short,*>|std::basic_string<wchar_t,*>{
    preview     ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,su] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,su] ))
    stringview  ( #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) ( [$e._Mypair._Myval2._Bx._Buf,sub] ) #else ( [$e._Mypair._Myval2._Bx._Ptr,sub] ))

    children (
        #(
            #([size] : $e._Mypair._Myval2._Mysize),
            #([capacity] : $e._Mypair._Myval2._Myres),
            #if (($e._Mypair._Myval2._Myres) < ($e._Mypair._Myval2._BUF_SIZE)) (
                #array(expr: $e._Mypair._Myval2._Bx._Buf[$i], size: $e._Mypair._Myval2._Mysize)
            ) #else (
                #array(expr: $e._Mypair._Myval2._Bx._Ptr[$i], size: $e._Mypair._Myval2._Mysize)
            )
        )
    )
}
std::deque<*>{
    preview (
            #(
            "[",
            $e._Mypair._Myval2._Mysize,
            "](",
            #array(
                expr: $e._Mypair._Myval2._Map[(($i + $e._Mypair._Myval2._Myoff) / $e._EEN_DS) % $e._Mypair._Myval2._Mapsize][($i + $e._Mypair._Myval2._Myoff) % $e._EEN_DS],
                size: $e._Mypair._Myval2._Mysize
            ),
            ")"
        )
    )

    children (
        #(
            #array(
                expr: $e._Mypair._Myval2._Map[(($i + $e._Mypair._Myval2._Myoff) / $e._EEN_DS) % $e._Mypair._Myval2._Mapsize][($i + $e._Mypair._Myval2._Myoff) % $e._EEN_DS],
                size: $e._Mypair._Myval2._Mysize
            )
        )
    )
}
std::forward_list<*>{
    preview (
        #(
            "(",
            #list(
                head: $e._Mypair._Myval2._Myhead,
                next: _Next
            ) : $e._Myval,
            ")"
        )
    )

    children (
        #list(
            head: $e._Mypair._Myval2._Myhead,
            next: _Next
        ) : $e._Myval
    )
}
std::vector<bool,*>{
    preview (
        #(
            "[",
            $e._Mysize,
            "](",
            #array(
                expr: (bool)(($e._Myvec._Mypair._Myval2._Myfirst[$i / $e._EEN_VBITS] >> ($i % $e._EEN_VBITS)) & 1),
                size: $e._Mysize
            ),
            ")"
        )
    )

    children (
        #(
            #([size] : $e._Mysize),
            #([capacity] : ($e._Myvec._Mypair._Myval2._Myend - $e._Myvec._Mypair._Myval2._Myfirst) * $e._EEN_VBITS),
            #array(
                expr: (bool)(($e._Myvec._Mypair._Myval2._Myfirst[$i / $e._EEN_VBITS] >> ($i % $e._EEN_VBITS)) & 1),
                size: $e._Mysize
            )
        )
    )
}
std::vector<*>{
    preview (
        #(
            "[",
                $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst,
            "](",
            #array(
                expr: $e._Mypair._Myval2._Myfirst[$i],
                size: $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst
            ),
            ")"
        )
    )

    children (
        #(
            #([size] : $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst),
            #([capacity] : $e._Mypair._Myval2._Myend - $e._Mypair._Myval2._Myfirst),
            #array(
                expr: $e._Mypair._Myval2._Myfirst[$i],
                size: $e._Mypair._Myval2._Mylast - $e._Mypair._Myval2._Myfirst
            )
        )
    )
}
std::map<*>|std::multimap<*>|std::set<*>|std::multiset<*>{
    preview (
        #(
            "[",
            $e._Mypair._Myval2._Myval2._Mysize,
            "](",
            #tree(
                head: $e._Mypair._Myval2._Myval2._Myhead->_Parent,
                skip: $e._Mypair._Myval2._Myval2._Myhead,
                left: _Left,
                right: _Right,
                size: $e._Mypair._Myval2._Myval2._Mysize
            ) : $e._Myval,
            ")"
        )
    )

    children (
        #(
            #tree(
                head: $e._Mypair._Myval2._Myval2._Myhead->_Parent,
                skip: $e._Mypair._Myval2._Myval2._Myhead,
                left: _Left,
                right: _Right,
                size: $e._Mypair._Myval2._Myval2._Mysize
            ) : $e._Myval
        )
    )
}
std::unordered_map<*>|std::unordered_multimap<*>|std::unordered_set<*>|std::unordered_multiset<*>|stdext::hash_map<*>|stdext::hash_multimap<*>|stdext::hash_set<*>|stdext::hash_multiset<*>{
    preview (
        #(
            "[",
            $e._List._Mysize,
            "](",
            #list(
                head: $e._List._Myhead->_Next,
                size: $e._List._Mysize,
                next: _Next
            ) : $e._Myval,
            ")"
        )
    )

    children (
        #list(
            head: $e._List._Myhead->_Next,
            size: $e._List._Mysize,
            next: _Next
            ) : $e._Myval
    )
}
0
Dwayne Fujima