Hatena::ブログ(Diary)

言語ゲーム このページをアンテナに追加 RSSフィード Twitter

とあるエンジニアが嘘ばかり書く日記
ホームページ | blog | twitter

2006-11-09

Win32 開発で printf デバッグをする方法

長年の謎がついに解けました。万年 C 言語初心者の私にとって。小躍りせんばかりに嬉しい豆知識です。皆さんご存知でしたか? Windows プログラムでもちゃんと printf デバッグが出来るのです!

  • Windows プログラムで標準出力を表示する方法。
    • Windows プログラムは自動的には標準出力をコンソールに書き出さない。
    • > や | 等のパイプ演算子が明示的にコマンドラインにあると標準出力を読める。
    • 例1: program.exe > log.txt
    • 例2: program.exe | cat
    • プログラムの中では printf() の後にしつこく fflash() を入れると効果的。

Windows には大まかに二つのプログラム形態があります。コンソールプログラムと GUI プログラムです。コンソールプログラムは伝統ある DOS 窓から実行するやつで、GUI は一般的なダブルクリックで実行するやつです。コンソールの方は linux のプログラムなんかと同じくプログラムの標準出力を利用してデバッグしたりテキスト処理が出来るのですが、GUI プログラムの標準出力は謎の動きをするので避けて通っていました。

しかし昔から Squeak VM のソースコードを読んでいて、あちらこちらに埋め込まれている printf 見るに付け、一体アンドレアスはこれをどう使っているのか、もしかして目の交換でもしないと標準出力が見えないのではないかと不審に思っていたのです。結論は簡単でした。(たぶん) GUI プログラムとしてコンパイルされたプログラムは、自動的に標準出力をコンソールに吐き出さないだけで、実行時にパイプで指定すると利用する事は出来るという事でした。これは Windows 界では常識なのでしょうか?醜悪だ。。。

これでまた謎が一つ解けた。

wraith13wraith13 2006/11/09 21:23 フツーは OutputDebugString x DebugView( www.sysinternals.com ) だと思うよ。
あと、コンソールプログラムでもデバッグ目的での出力なら俺の場合、標準エラー(stderr)を利用したりする。これなら標準エラーだけログファイルに出力させて通常の出力を汚さなくて済むから。

propellapropella 2006/11/09 22:07 おおー。デバッグ出力専用の関数があったんですか!渋い。まさかこんな物があるとは想像もしてませんでした。これで快適な Windows ライフが過ごせそうです。有難うございます。

FlorianFlorian 2006/11/09 22:38 OutputDebugString(char*)とwsprintf(char*,...)(Win32の簡易版sprintf)の組み合わせは、あれが、それで、なにな感じがひしひしと……(歯切れ悪いぞ(^^;))。
そうそう、ちょうど今週の初めに見習い魔法使い達に対してやった授業が「Windows上でprintfデバッグ」でした。

propellapropella 2006/11/09 23:08 どうせデバッグ用だから数字と英文字さえ出れば良いですよ。
しかしやっぱり書式の事を考えると OutputDebugString より printf の方が便利ですねー。最初から標準エラー出力が Visual Studio の出力ウインドウに出てくるようになってりゃいいのに。。。

squeakersqueaker 2006/11/09 23:48 Emacsの中で起動すればよいんですよ。

propellapropella 2006/11/10 00:40 前々からなぜ Emacs の中に居るときだけログが出るのだろうと不思議に思っていたのです。きっと Meadow が本物の端末じゃないから出てたんでしょうね。でも理屈が分かったから Emacs に頼らなくても良くなりましたよ!

トラックバック - http://d.hatena.ne.jp/propella/20061109/p1
リンク元

カレンダー
<< 2006/11 >>
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
最新コメント一覧