たまにはVC++

『SDKでのデバッグ出力』
2003.Jun.26

デバッグ

デバッグ・・・
いわゆるバグを除く事です。ある意味プログラマのメインとなる仕事ですね。(たぶん)

デバッガを使ったデバッグでよく使うのが、ブレークポイント、ウォッチウィドウ、メモリウィンドウ、デバッグ出力・・・などなどです。
デバッグもなかなかクセ者でして(元木!)、プログラムや環境によってはブレークなどができない場合があります。
そこでコンソールのprintfに代わるものがあったら便利だと思いませんか?
MFCの場合、TRACE()マクロというものが用意されていますが、これはSDKでは使えません。

そ・こ・で!

ないなら作れ!
TRACE()マクロを自作してみましょう。
デバッグ出力するAPI

実はデバッガのストリームに出力してくれるAPIがWindowsには用意されていたりまします。

VOID OutputDebugString(
  LPCTSTR lpOutputString // 出力する文字列へのポインタ
);


使い方は簡単。

OutputDebugString("たろの部屋\n");

戻り値はありません。
機能を拡張する!

一応最大の難関である「ストリームへの出力」は上のAPIがやってくれますので後はなんとでもなります。
デバッグ出力したい場合、それは文字列だけとは限りません、ある変数の値、ポインタ、もしかしたらdoubleなんかも表示できたら便利ですね。
そう、printfと同じく書式指定、これが出来ればものすごーく便利になりそうな予感がします。

APIを呼び出す前にsprintf()なんかで書式化すれば問題なさそうですが、いちいち呼ぶのも面倒ですし、バッファとなる変数も宣言せにゃなりません。
デバッグ専用サブルーチンを作る

ってな訳で、書式可変個数の引数を受け取れるデバッグ専用のサブルーチンを作ってやります。

ソースはここだ!

ちょこっと解説

さて、ソースを見たとおり第一引数は書式指定。第二引数は引数リストとなります。
んー、こいつぁ便利ですね。
バッファの容量が256バイトという制限がありますが、256文字以上一気に表示するなんて滅多にないでしょう。


ポイントはヘッダーでの宣言ですね。
_DEBUGってのは(VisualStudioの場合)デバッグコンパイルした時デフォルトで定義されているプリプロセッサです。
つまりリリースコンパイル時にはこの関数は”なかった事”と見なされます。
関数ポインタ自体がなくなりますので、引数として渡した文字列などもなくなります
つまりデバッグの時しか使わない文字列などはオブジェクトの中に組み込まれないというわけです。

__noopというキーワードをコメント化していますが、VS.NETの場合は__noopを使用しないと上手くコンパイル出来ません。
使い方

TRACE("たろの部屋の管理人は %s さんです\n", "たろ");
出力

たろの部屋の管理人は たろ さんです


こりゃ便利ですね。
応用

この自作TRACE()マクロのすごいとこは何もデバッグの時だけではありません。
まず宣言を変えて、リリース時にも有効します。
んでDebugPrint()関数とコンパチな関数をもう1つ作ります。
その関数にはストリームではなくファイルへの出力とすればどうでしょう?
デバッグ情報がファイルへ出力できるという、んー、スバラスィ!
終わり

今回はいつもとはちょっと違ったサンプルでした。
今回プロジェクトはないので、ソースをコピーするなどして存分に使ってください。



[先頭ページへ] [次のページへ]

リンクフリー  Copyright (C) K_Yaguchi