25

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

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

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

メニューツールを変更した場合*?オプションデバッグ一般に、出力をイミディエイトウィンドウにリダイレクトする場合、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ません。

コンソールウィンドウから実行すると、両方がDebugViewDebug.WriteLineに表示されます。OutputDebugString

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

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

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

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

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

ここここ

4

4 に答える 4

37

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

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

于 2010-06-14T19:43:39.267 に答える
9

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

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

于 2011-02-20T10:50:26.960 に答える
3

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

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

またはそのような何か。

于 2010-06-14T18:56:40.130 に答える
1

[プロジェクト]>[プロパティ]>[デバッグ]タブ>[アンマネージコードのデバッグを有効にする]にチェックマークを付けましたがOutputDebugString()、ブレークポイントが機能していても機能しませんでした。

ソリューション>共通プロパティ>プロジェクトの依存関係>C#プロジェクトでDLLにチェックマークを付けましたが、ビルドの依存関係が機能しませんでした。

これらの両方の問題の修正は、[ソリューション]>[構成プロパティ]>[DLLのビルドにチェックマークを付ける]でした。

于 2020-07-28T19:47:33.850 に答える