【MFC】DebugView でリリース後のログを見る

【MFC】DebugView でリリース後のログを見る

「ユーザー環境でだけ挙動がおかしい」と言われても、現場に Visual Studio を持ち込めないことはよくあります。アプリが OutputDebugString でデバッグ出力を送っていても、それを拾う手段がなければ調査が止まってしまいます。

この記事では、Sysinternals の DebugView を使って、デバッガのない環境でもアプリのデバッグ出力を拾い、フィルタし、ログファイルに保存するまでの流れをまとめています。

今やりたいこと読む記事
コードからログを出したいOutputDebugString の使い方
デバッガなしでログを受け取りたいこの記事(DebugView)
Release 固有の不具合をPDBや最適化設定まで含めて追いたいReleaseビルドのデバッグ手順

目次

DebugView でできること

DebugView は、Windows の OutputDebugString や、Debug 構成で実行される MFC の TRACE による出力をリアルタイムで表示するツールです。デバッガが付いていなくても出力を拾えるところに価値があります。

出力方法Visual Studio 出力ウィンドウDebugView
OutputDebugString / TRACEデバッグ実行中のみ表示デバッガなしでも表示
printf / std::coutコンソールに表示非対応(標準出力は拾わない)

「配布済みの Release 版アプリから状況を見たい」「客先のテスト PC でしか起きないログを拾いたい」といった場面で役立ちます。


手順1:入手と起動

DebugView は Microsoft の Sysinternals から入手できます。インストーラはなく、Dbgview.exe を置いて実行するだけです。

DebugView v5.0 は標準ユーザーで起動し、カーネルモードのキャプチャなど権限が必要な操作を選んだ時点で UAC 昇格を求めます。サービス、別セッション、権限の異なるプロセスの出力を調べる場合は、必要に応じて昇格や Capture Global Win32 を使ってください。


手順2:Capture メニューで取りたい出力を選ぶ

現在の DebugView は起動するとキャプチャを開始します。目的の出力が見えない場合や対象を切り替える場合は、Capture メニューで設定を確認します。画面構成は v4.90 と v5.0 で異なりますが、通常のアプリでは Capture Win32 を確認する点は同じです。

  • Capture Win32:通常のアプリ(ユーザーモード)からの OutputDebugString を拾う
  • Capture Global Win32:他のセッション(サービス・他ユーザー)の出力も拾う。管理者権限が必要
  • Capture Kernel:カーネルモードドライバからの DbgPrint を拾う
  • Pass-Through:DebugView が拾ったあとも、VS のデバッガ側でも見えるように通す
DebugView の Capture メニューで Capture Win32 と Capture Global Win32 にチェックが入っている画面

重要な制約として、同じ出力を同時に2つのツールが独占的に受け取ることはできません。DebugView が受けている最中は、Visual Studio のデバッガが OutputDebugString を見られないことがあります(Pass-Through 有効時を除く)。


手順3:アプリを起動して流れを見る

キャプチャを有効にしたまま、調べたいアプリを普通に起動します。アプリが OutputDebugString / TRACE を呼ぶと、DebugView の一覧にリアルタイムで行が追加されていきます。

DebugView のログ一覧に テストアプリからの MyApp ログが流れている画面

各行には次の情報が並びます。

  • #:通し番号
  • Time:キャプチャされた時刻(設定で経過秒にも切り替え可)
  • Debug Print:プロセス ID とメッセージ本文

自作アプリなら、ログに共通のプレフィクス(例 [MYAPP])を付けておくと後で効きます。他のアプリやシステム側の出力と混じっても、一瞬で自分のログだけ引けるからです。


手順4:Filter/Highlight で必要な行だけに絞る

ログはすぐ埋もれます。Edit > Filter/Highlight...Ctrl + L)で、表示する行と強調する行を絞り込みます。

  • Include:ここにマッチする行だけを表示する
  • Exclude:邪魔な行を隠す
  • Highlight:特定パターンにだけ色を付ける(最大5色)
DebugView の Filter/Highlight ダイアログで Include と Highlight にパターンを設定している画面

ワイルドカード *? が使えます。たとえば MYAPP*ERROR* のように複合条件で、エラー行だけ赤くすると、長時間キャプチャからでも原因位置がすぐ目に入ります。


手順5:ログをファイルに残す

調査中のログは後から見返したくなることが多いので、その場でファイルに保存できる運用を用意しておきます。

  • File > Save As...:現在画面に見えている範囲をテキストで保存
  • File > Log to File...:キャプチャと同時に、リアルタイムでファイルへ書き出し続ける
DebugView で File Save As ダイアログを開き trace_34.log という名前で保存しようとしている画面

長時間の監視は Log to File がおすすめです。画面が流れて見失ってもファイルには残っており、あとから findstr や VS Code で解析できます。


リモートモードでネットワーク越しに見る

客先 PC に DebugView を走らせておき、手元のマシンからネットワーク越しにそのログを見ることもできます。

  • 客先 PC:Dbgview.exe /a (エージェントモード)で起動、ファイアウォールで受信を許可
  • 手元:Computer > Connect... から客先 PC の名前や IP を指定して接続

ユーザーに DebugView の UI を操作させずに済むので、操作手順を説明する手間を減らせます。ネットワーク構成次第ですが、試す価値はあります。


自分のコードで試す

動作を確かめるだけなら、自分のアプリの適当な処理に OutputDebugString を数行仕込むだけで十分です。たとえば プレフィクス付きで5行ほどログを出す次のようなコードを通ると、DebugView 側に順に流れてきます。MFC の TRACE でも挙動は同じです。

for (int i = 1; i <= 5; ++i)
{
    CString msg;
    msg.Format(_T("[MyApp] step=%d status=running\n"), i);
    OutputDebugString(msg);
}
OutputDebugString(_T("[MyApp] step=done status=ok\n"));

DebugView の Capture Win32 を有効にしてから、このコードを含むアプリを起動すると、[MyApp] のログが順に流れてきます。Filter/HighlightMyApp*Include に入れれば、他のアプリのログと混じっても自分の出力だけ見えます。


まとめ

  • [ ] DebugView は Release ビルドのデバッグ出力を拾える。デバッガがない現場に強い
  • [ ] 通常の Win32 出力は標準ユーザーで確認できる。別セッションやカーネル出力では必要に応じて昇格する
  • [ ] 自作アプリの出力には 共通プレフィクス を付けておく。後で自分のログだけ絞り込みやすくなる
  • [ ] 長時間監視は File > Log to File... で流し撮り、あとから解析
  • [ ] VS デバッガと DebugView の二重受信は基本できないので、切り分けて使う
目次