【MFC】Watch Window (ウォッチウィンドウ) のフォーマット指定子

【MFC】Watch Window (ウォッチウィンドウ) のフォーマット指定子

ウォッチウィンドウでは、停止中の変数や式をその場で確認できます。

この記事では、フォーマット指定子を使ってエラーコード、配列、文字列バッファを見やすく表示する方法を記載します。


目次

ウォッチウィンドウの基本と開き方

一応のおさらいです。デバッグ(一時停止)中に、メニューの 「デバッグ(Debug)」 -> 「ウィンドウ(Windows)」 -> 「ウォッチ(Watch)」 -> 「ウォッチ 1」 を選択すると画面下部に表示されます。

「名前」の列に評価したい変数名や計算式を入力すると、「値」の列に現在の結果が表示されます。


使い方1:エラーコードを表示する (,hr)

Windows APIやCOMの関数が失敗したとき、戻り値や GetLastError() で得られるのは 0x800040055(アクセス拒否)といった無機質な数値(エラーコード)です。

これをわざわざブラウザで検索しなくても、ウォッチウィンドウ上で「人間が読める日本語メッセージ」に自動翻訳させることができます。変数名の末尾に ,hr(HRESULTの略)を付けるだけです。

入力(名前列)結果(値列)
nErrorCode-2147467259
nErrorCode, x0x80004005 (※ ,xは16進数表示)
nErrorCode, hr0x80004005 (エラーを特定できませんでした。)

疑似変数と組み合わせる例 (@err, hr)

Visual Studioにはデバッガ専用の「疑似変数」が存在します。その代表が @err(最後に発生したスレッドのエラーコード、すなわち GetLastError() の戻り値)です。

ウォッチウィンドウに @err, hr と入力しておくと、API呼び出し直後に GetLastError() を明示的に呼ばなくても、失敗内容を確認できます。

ウォッチウィンドウで @err, hr を入力し、「0x00000005 (アクセスが拒否されました。)」と表示されているスクリーンショット

使い方2:ポインタを配列として表示する (,数値)

動的に確保した配列(ヒープメモリ)のポインタをウォッチウィンドウに入れても、通常はコンパイラが「要素数」を知らないため、先頭の1要素分([0]の中身)しか表示されません。

// 100個の要素を確保したが...
int* pArray = new int[100];

これを、指定した要素数分だけ配列としてツリー展開させることができます。カンマの後に表示したい要素数を書きます。

入力(名前列)結果(ツリー展開時の振る舞い)
pArraypArray[0] の値だけが表示される
pArray, 10[0] から [9] までの10個の要素がズラッと一覧表示される

画像処理などで、ポインタが指す先頭数十要素の内容をまとめて確認したい場合に使えます。


使い方3:生データを文字列として表示する (,su / ,s8)

通信で受け取ったバイナリバッファ(char型の配列や BYTE*)の中に文字列が入っている場合は、フォーマット指定子で文字列として表示できます。

  • pBuffer, su (String Unicode):
    ポインタの先をUTF-16(ワイド文字)として表示します。MFCの CStringW や内部バッファの強制確認に便利です。
  • pMsg, s8 (String UTF-8):
    ポインタの先をUTF-8文字列として認識し、文字化けせずに日本語として綺麗に表示してくれます。Web APIとの通信デバッグなどで必須の指定子です。

まとめ

  • [ ] ウォッチウィンドウでは、停止中の値を表示形式付きで確認できる。
  • [ ] @err, hr は、API失敗時の確認用として覚えておく。
  • [ ] 動的配列は pArray, 100 のように、カンマ+数値で先頭要素をまとめて確認できる。
目次