「ユーザー環境でだけ挙動がおかしい」と言われても、現場に 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 を置いて実行するだけです。
- Microsoft Sysinternals の DebugView ページからダウンロード
Dbgview.exeを起動する。通常の Win32 出力を拾うだけなら標準ユーザーで開始できます
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 のデバッガ側でも見えるように通す

重要な制約として、同じ出力を同時に2つのツールが独占的に受け取ることはできません。DebugView が受けている最中は、Visual Studio のデバッガが
OutputDebugStringを見られないことがあります(Pass-Through有効時を除く)。
手順3:アプリを起動して流れを見る
キャプチャを有効にしたまま、調べたいアプリを普通に起動します。アプリが OutputDebugString / TRACE を呼ぶと、DebugView の一覧にリアルタイムで行が追加されていきます。

各行には次の情報が並びます。
#:通し番号Time:キャプチャされた時刻(設定で経過秒にも切り替え可)Debug Print:プロセス ID とメッセージ本文
自作アプリなら、ログに共通のプレフィクス(例 [MYAPP])を付けておくと後で効きます。他のアプリやシステム側の出力と混じっても、一瞬で自分のログだけ引けるからです。
手順4:Filter/Highlight で必要な行だけに絞る
ログはすぐ埋もれます。Edit > Filter/Highlight...(Ctrl + L)で、表示する行と強調する行を絞り込みます。
Include:ここにマッチする行だけを表示するExclude:邪魔な行を隠すHighlight:特定パターンにだけ色を付ける(最大5色)

ワイルドカード * と ? が使えます。たとえば MYAPP*ERROR* のように複合条件で、エラー行だけ赤くすると、長時間キャプチャからでも原因位置がすぐ目に入ります。
手順5:ログをファイルに残す
調査中のログは後から見返したくなることが多いので、その場でファイルに保存できる運用を用意しておきます。
File > Save As...:現在画面に見えている範囲をテキストで保存File > Log to File...:キャプチャと同時に、リアルタイムでファイルへ書き出し続ける

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