2014年1月17日金曜日

[Visual Studio] ウォッチをより便利に使う10の書式

Visual Studio のウォッチ式で使える便利な書式を紹介したいと思います。
(※ Visual Studio 2013 を対象としています。古いバージョンでは使えないものもあります。)

説明用サンプルコード
class B { 
    int a, b, c; 
    virtual void f() {}
};
class D : public B { int x, y, z; };

int main()
{
    D d;
    B* b = &d;

    ::std::vector<int> v{ 0, 1, 2 };

    int a[1024];
    for( int i=0; i < _countof(a); ++i ) a[i] = i;

    void* p = a;
    unsigned char* p8 = reinterpret_cast<unsigned char*>(a);

    char str[] = "Hello world.";
    void* pstr = str;

    DWORD dwWC = WS_CAPTION;
    DWORD dwMsg = WM_ACTIVATE;

    return 0;
}

1. 配列表示
「var, 4」
要素数を指定することで配列でない型でも配列表示できます。


2. 基数指定表示
基数
d10進数
u10進数(符号なし)
o8進数
x, h16進数(小文字)
X, H16進数(大文字)

右クリックメニューで 16進表示の ON/OFF が変更できますが、これはすべてのウォッチ式に適応されます。
1つだけ 16進で見たい場合などには上記書式を使うと便利です。
また、あまり使う機会は少ないかと思いますが 8進表示もできます。


3. 文字列指定表示
文字
c単一文字
s(b)ASCII文字列
su(b)UNICODE文字列
s8(b)UTF8文字列
bstrBSTR文字列

変数を文字列として表示します。
文字列型ではないが文字列が格納されている場合などに使います。
b を付けた場合「"」で囲まれずに表示されます


4. HRESULT表示
「var, hr」とすることで値を HRESULT名(define名)+メッセージで表示できます。
数値ではわかりにくいメッセージID もこれならすぐにわかります。


5. Windows メッセージ・クラスフラグ表示
「var, wm」とすることで HRESULT と同様に値を WM_*** のような define名で表示できます。
「var, wc」とすると値をクラスフラグ名(define名)で表示できます。


6. アドレス・派生クラス非表示
「ptr, na」とするとアドレスが非表示になります。
「ptr, nd」とすると派生クラスが非表示になります。


7. simple 表示
「var, view(simple)」
Visual Studio 2013 から追加された機能で、view(xxxx) とすることで表示非表示の選択ができるようになっています。
::std::vector の場合、view(simple) とすることで size と capacity を非表示にできます。


8. 組み合わせ
ここまで紹介してきた書式は組み合わせて使うことができます。
たとえば、アドレス・派生クラスの非表示で16進数表示する場合は、「var, nandx」と書きます。


9. カスタマイズ表示の無効化
「var, !」とするとカスタム表示ではなく、型そのままの表示がされます。


10. 擬似変数
ウォッチでは下記のような特殊な情報も表示できます。
$handlesアプリケーションに割り当てられているハンドル数
$vframe現在のスタックフレームのアドレス
$tid現在のスレッドID
$env環境変数
$cmdlineコマンドライン引数
$pidプロセスID
$(registername)レジスタの値
@(registername)レジスタの値
$clkクロック周期
$userアプリケーションの実行ユーザー情報を表示

通常なら関数呼び出しで取得するような情報ですが、
擬似変数を使えばコードに仕込まなくても閲覧できるので非常に便利です。


また、これらは式の一部としても使えるので、
ESP レジスタが指す場所の値を見たいときは「*(int*)@esp」とすると見れます。




最後に
いかがでしたでしょうか?
こちらで紹介した内容は MSDN にも載ってますのでそちらも参考にしてください。

また、今回はウォッチでの書式についてでしたが、Visual Studio ではカスタムビューという仕組みもあり、
それを利用することで vector のような見やすい表示にすることができます。
カスタムビューについてはこちらを参考にしてください。
ブログズミ: [Visual Studio] デバッガー変数表示のカスタマイズ

0 件のコメント:

コメントを投稿