web-dev-qa-db-ja.com

OutputDebugStringからの出力をVisualStudioの出力ウィンドウで表示できますか?

C#とVisual Studio2010を使用しています。

OutputDebugStringを使用してデバッグ情報を書き込む場合、出力ウィンドウに表示する必要がありますか?

DebugViewOutputDebugStringからの出力を確認できますが、VisualStudioの[出力]ウィンドウに表示されると思いました。メニューツールの下を見ましたか? オプションデバッグGeneralであり、出力はイミディエイトウィンドウにリダイレクトされていません。メニューのツール*も確認しましたか? オプションデバッグ出力ウィンドウおよびすべての一般出力設定が「オン」に設定されています。最後に、[出力]ウィンドウのドロップダウンリストを使用して、デバッグメッセージを表示するように指定しました。

メニューツール*を変更した場合? オプションデバッグGeneral出力をイミディエイトウィンドウにリダイレクトする場合、OutputDebugStringメッセージはイミディエイトウィンドウに表示されません。

これが私のテストプログラム全体です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace OutputDebugString
{
  class Program
  {
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern void OutputDebugString(string message);

    static void Main(string[] args)
    {
      Console.WriteLine("Main - Enter - Console.WriteLine");
      Debug.WriteLine("Main - Enter - Debug.WriteLine");
      OutputDebugString("Main - Enter - OutputDebugString");
      OutputDebugString("Main - Exit - OutputDebugString");
      Debug.WriteLine("Main - Exit - Debug.WriteLine");
      Console.WriteLine("Main - Exit - Console.WriteLine");
    }
  }
}

デバッガー内で実行すると、Debug.WriteLine出力は出力ウィンドウに表示されますが、OutputDebugString出力は表示されません。

コンソールウィンドウから実行すると、Debug.WriteLineOutputDebugStringの両方がDebugViewに表示されます。

OutputDebugString出力が出力ウィンドウに表示されないのはなぜですか?

最終的に、私の意図はOutputDebugStringを使用して多くのデバッグ出力を書き込むことではなく、System.DiagnosticsまたはNLogなどを使用します。 OutputDebugStringに書き込むようにロギングプラットフォームを構成した場合、出力がデバッガー内から表示されるかどうかを調べようとしています。

app.configファイルを介して構成されたTraceSourcesTraceListenersを使用する元のプログラム(上記の単純なテストではありません)に戻りました。トレースソースをSystem.Diagnostics.DefaultTraceListenerOutputDebugStringへの書き込みとして文書化されています)に書き込むように構成すると、トレースソースの出力はデバッグウィンドウに移動します。ただし、OutputDebugStringで直接書き込む行(私の簡単な例のように)は、デバッグウィンドウに移動しません。また、TraceListenerに書き込む別のOutputDebugStringを使用した場合(CodeplexのUkadc.Diagnosticsから入手したもの)、その出力はデバッグウィンドウに移動しません。

Ukadc.Diagnosticsトレースリスナーに関する注意事項... Ukadc.Diagnosticsには、出力のカスタムフォーマットを可能にするいくつかのトレースリスナーが含まれています(log4net、NLog、およびLABで使用可能なフォーマットと同様)。したがって、Ukadc.Diagnosticsに「のみ」依存している場合は、「標準」の.NET診断ログを使用できますが、おそらくはるかに大きなプラットフォームに依存することなく、いくつかの高度な機能(出力フォーマットなど)を取得できます。この場合、Ukadc.Diagnostics OutputDebugStringTraceListenerを使用して、ファイルに書き込む場合と同じ形式(必要に応じて、または異なる形式)でログ出力をデバッグウィンドウに書き込むことができます。

私はこれらの質問を見ましたが、それらは実用的な解決策を提供しなかったことに注意してください:

ここ および ここ

22
wageoghe

あなたは私にこの質問をしばらく続けさせました。ありえない!仕方。

[プロジェクト]> [プロパティ]> [デバッグ]タブで、[アンマネージコードのデバッグを有効にする]チェックボックスをオンにします。それ以降のVSバージョンでは、「ネイティブコードのデバッグを有効にする」に名前が変更されました。アンマネージコードデバッグエンジンを有効にすると、OutputDebugString()出力が適切にインターセプトされ、[出力]ウィンドウに送信されるようになりました。

36
Hans Passant

デバッグする場合([デバッグ] => [デバッグの開始] F5)、[プロジェクト+プロパティ]の[デバッグ]タブで、[アンマネージコードのデバッグを有効にする]チェックボックスをオンにするとうまく機能します。

デバッグしない場合([デバッグ] => [CTRL + F5をデバッグせずに開始])、SysInternalsライブラリのDebugViewを使用する必要があります。 DebugView for Windows v4.76をダウンロード

9

次の設定により、代わりに「イミディエイトウィンドウ」に表示される場合があります。

  • [ツール]/[オプション]/[デバッグ]/[一般]に移動します。 [すべての出力ウィンドウのテキストをイミディエイトウィンドウにリダイレクトする]のチェックを外します

またはそのような何か。

3
Michael Burr