やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

VC++で楽にデバッグ出力する方法

VC++でどうやってデバッグ出力しようかいつも迷う。 今更だが、調べてみた。

方法

  • デバッカ
  • 標準出力(printf,cout)
  • Windows出力(MessageBox)
  • VC++IDE出力(OutputDebugString)
  • ファイル出力(fprintf, ofstream)
  • 専用関数をつくる

デバッカ

デバッカで表示すればいい。そのとおり。これですべて解決。やったね!

いやまて、一度に大量の値を確認したいとき、いちいちブレークポイント張って確認なんてやってらんないんだよ。ドバっと出せ!

printf, cout

標準出力にだせばいいじゃん、と思うでしょ?

でも、コマンドプロンプト画面は無常にも一瞬で閉じてしまう。 何が出力されたのか見るヒマがない。 嫌がらせなの?動体視力の訓練なの?バカなの?

デバックなしで開始

ふつうVC++2010Expressでは、"デバッグ開始(F5)"で実行する。 これを"デバックなしで開始(Ctrl+F5)"にすると、止まってくれる。 これでprintf, coutで出力した内容を確認できる。

え、こんな簡単に解決できたんだ……。 よく調べもせずに悪口いってごめんなさい。 考えてみれば、毎回とじるのも面倒だわ。

でも今度はショートカットが面倒になるじゃん。

  • CtrlとF5は遠いんだよ!
  • だからといってデフォルトのキー操作を変えるの面倒
  • あとで世間とのズレに混乱するかも。キー変更したことなんか忘れる。

pauseコマンド

コマンドプロンプトにはpauseコマンドがある。 何かキーを押さねば終了しないようにするためのコマンドだ。 これをC++側で実行できればいい。

system("pause");

system関数でできるっぽい。

これでF5キー実行しつつ標準出力で見れる。やったね!

でも、余計なコードを混ぜ込むことになるじゃん。 コードみて「system("pause");ってなんだよ!」って話になりそう。

コピペ

一応コマンドプロンプトでのコピペ方法。キーボードだけで操作すると楽。

  1. コピー
    1. [ALT]+[Space]キー押下する
    2. [E]キー押下する(編集)
    3. [S]キー押下する(すべて選択)
    4. [Enter]キー押下する(コピー)
  2. ペースト
    1. [ALT]+[Tab]でテキストエディタを選択する
    2. [CTRL]+[V]でペーストする

Windows専用API

どちらも#include<Windows.h>すると使える。

どちらも文字列型を渡す必要がある。 困るのは数値を表示したいとき。 以下のようなクソ面倒くさいことをせねばならない。

  1. 文字列バッファを確保
  2. 数値を文字列に変換する
  3. ほかの文字列と結合する
  4. 表示する
  5. バッファを解放する

ただでさえWindowsの場合、TCHARがらみのせいで、_Tマクロやbasic_string<TCHAR>などのような特殊な記述をせねばならないというのに……。

もはやデバッグのためにプログラミングを作り込むレベル。 こんなことしないと表示できないなんて……バカなの? じつはこれをよくやっていて無駄に苦労していた。バカは私です。

sprintfstringstreamを使えばだいぶ楽はできるかもしれない。でも、直接出力したんだよ!

さらに、それぞれ以下のような欠点もある。

MessageBox

  • いちいちメッセージボックスが出て処理がとまる
  • コピペできない

OutputDebugString(char*)

VC++デバッグ出力ウインドウまたはイミディエイトウインドウに表示する。

処理は止まらないし、コピペもできる。 でも、表示領域が小さい。 実際はテキストエディタにコピペしないと見れたもんじゃない。

大きく表示すればいいのだけど、特殊なウインドウ操作でマウス必須っぽい。 絶対キーボードから手を離したくない!

なので、コピペしてテキストエディタに貼り付けて確認していた。 それも面倒になってきた。

ファイル出力(fprintf, ofstream)

論外。 べつにファイルなんていらない。 そのときだけ目視できればいい。

いちいちファイル名とかパスとか考えたり指定したりするの面倒くさい。 パス文字数制限とかでひっかかる罠とか嫌。

専用関数をつくる

coutの出力先をOutputDebugStringに切り替える
http://fa11enprince.hatenablog.com/entry/2015/07/04/192645

可変引数でOutputDebugStringする
http://d.hatena.ne.jp/taiyakisun/20140702/1404255973

すばらしい。こんなことできるのか。 みずから問題をみつけ解決することこそがプログラミング!

でも、作らなきゃいけないのか……面倒くさい。 デバッグするために作りこむって、なんか主旨と違う。 その作りこんだコードを確認するとき、どうやって楽にデバッグするんだ!って話が今回の主旨。

だいたい、作ったとして、またFrameworkみたいにして読み込まなきゃいけないの? ファイル配置とか参照設定とか面倒くさいわ。

デバッグのためだけに
あたらしく何も覚えたくない
あたらしく何も作りたくない

結論

デバッグ出力は以下の方法でやるのが一番楽。

  1. 標準出力でデバッグ内容を書き出す(printf,cout)。
  2. 以下のいずれかを行う。

たぶん実行する回数は多い。system("pause");を入れたほうが楽そう。 どうしてもsystem("pause");が嫌なら最後に削除すればいい。