web-dev-qa-db-ja.com

VisualStudioデバッグでのSTLコンテナーの検査

std::vectorまたはstd::map変数があり、その内容を確認したい場合、デバッグ中にn番目の要素を確認するのは非常に困難です。プラグイン、または(VS2003/2005/2008)のデバッグ中にSTLコンテナ変数を簡単に監視できるようにするためのトリックはありますか?

29
kevin42

ベクターの場合、msdnフォーラムのこの thread には、役立つ可能性のあるベクターインデックスにウォッチを設定するためのコードスニペットがあります。

14
christopher_f

同時に複数の要素を視聴したい場合は、次のようにコンマと要素数を追加できます。

(v._Myfirst)[startIndex], count

ただし、カウントは定数でなければならず、別の式の結果であってはならないことに注意してください。

18
Adam Rosenfield

VS2005およびVS2008では、STLコンテナーの内容を確認できます。データを取得するためのルールは、autoexp.dat "c:\ Program Files\Microsoft Visual Studio 9\Common7\Packages\Debugger\autoexp.dat"にあります。

AutoExp.datはカスタマイズすることを目的としています。ただし、STL定義は[ビジュアライザー]というセクションの下にあります。そのセクションで使用されている言語を理解できれば、より強力になりますが、その部分はそのままにしておくことをお勧めします。

Autoexp.datはVS2003に存在しましたが、STLコンテナーのサポートはありませんでした([Visualizer]は存在しませんでした)。 VS2003では、基になるデータ表現を手動でナビゲートする必要があります。

Autoexp.datを変更することにより、独自のタイプのデータ表現をナビゲートするためのルールを追加して、デバッグを容易にすることができます。これを行う場合は、[AutoExp]の下にあるものにのみ追加する必要があります。このファイルを変更する前に、注意してこのファイルのバックアップを保管してください。

11
Steve Steiner

Visual Studioデバッガーでコンテナーのn番目の要素を表示するには、次を使用します。

container.operator[](n)
7
1''

カスタムビジュアライザーを作成できます。これを確認してください: http://www.virtualdub.org/blog/pivot/entry.php?id=12

5
maxbog

最も簡単な方法は、このような変数を監視するためのポインターを準備する必要があることです。

vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".

VisualStudio2015で「a._Myfirst [0]」を試しましたが、配列データが表示されませんでした。

" natvis "を使用できる場合は、問題が解決します。

これは、Visual Studio2015のstd :: vectorデータを表示するための「sample.natvis」です。

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.Microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::vector&lt;*&gt;">
    <DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
      <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
      <ArrayItems>
        <Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
        <ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>

Beforeenter image description here

enter image description here

4
24k.wakahana

Visual Studio 2008は、少なくとも私にとっては、標準のマウスオーバーコンテンツボックスにSTLコンテナーのコンテンツを表示します。

3
anon6439

時計の任意の値を右クリックして、[時計を追加]を選択することもできます。これは、マップまたはセットの1つの要素のみを確認する必要がある場合に役立ちます。

それはまた、christopher_fがベクトルに対して投稿した解決策につながります-((v)._ Myfirst)[index]

1
tfinniga

上記の方法[((v)._ Myfirst)[index]]は、特定のコンテナー(std :: vector)に対してのみ機能し、すべての可能なSTLコンテナーに対しては機能しません。たとえば、std :: dequeのコンテンツを表示する場合は、std :: dequeのコンテンツを参照するための他の方法を探す必要があります。

たぶん、あなたはあなたの問題を解決するために次の同様の設定を試すことができます

[この設定は、Microsoft Visual Studio 2010 Service Pack1がインストールされたVisualStudio 2010 Professionalバージョンでのみテストしました]

手順1:Microsoft Visual Studio 2010 Service Pack 1をアンインストールする-プロジェクトの作業では、Service Pack 1は実際には必要ないため、Service Pack1をアンインストールしても問題は発生しません。

ステップ2:システムを再起動します。

手順3:エラーが発生しない場合はこの手順は不要です 'リンク:致命的なエラーLNK1123:COFFへの変換中に失敗しました:ファイルが無効または破損しています'。それ以外の場合は参照

プロジェクトプロパティ->リンカー(一般)-> [インクリメンタルリンクを有効にする]を[いいえ]に変更(/ INCREMENTAL:NO)

1
SridharKritha

2015年と比較して、これらのいずれも機能させることができませんでした
それで、私は少しコードを書きました

1:私は長い長い要素のベクトルのベクトル

std::vector<std::string> vs(M_coins + 1);
for (unsigned long long i = 0; i <= M_coins; i++) {
    std::for_each(memo[i].begin(), memo[i].end(), [i, &vs](long long &n) {
        vs[i].append(std::to_string(n));
        });
}
// now vs is ready for use as vs[0], vs[1].. so on, for your debugger

基本的に私がしたことは、ベクトルを文字列に変換することでした。私はベクトルのベクトルを持っていたので、埋める文字列ベクトルがありました。

2:長い長い要素のベクトルしかない場合は、次のように変換します。

std::vector<std::string> s;
std::for_each(v1.begin(), v1.end(), [&s](long long &n) {
    s.append(std::to_string(n));
    });
// now s is ready for use, for your debugger

それが役に立ったことを願っています。