OutputDebugString / System.Diagnostics.Debug.WriteLine和Debugger.IsAttached

时间:2016-12-20 21:54:20

标签: c#

我需要检查OutputDebugString / System.Diagnostics.Debug.WriteLine的输出是否会永远不会降落。

似乎OutputDebugString是一个本机方法,而System.Diagnostics.Debug.WriteLine正在写入内部跟踪侦听器。

是Debugger.IsAttached对此进行了充分的检查吗?

Debugger.IsAttached似乎没有像DebugView这样的东西运行。我需要能够检查ANYTHING是否会看到OutputDebugString / System.Diagnostics.Debug.WriteLine的输出。

1 个答案:

答案 0 :(得分:2)

如果你愿意亲自动手并使用一些原生的东西,你就可以做到这一点。你需要使用P / Invoke。

OutputDebugString,正如您可以阅读here,基于4个内核对象。 Mutex名为DBWinMutex,共享内存DBWIN_BUFFER和两篇事件(DBWIN_BUFFER_READYDBWIN_DATA_READY)正如他们在文章中所写的那样 - 我们无法继续互斥体一直存在。但我们可以检查共享部分是否已创建。

如果我们从pinvoke.net

导入OpenFileMapping到我们的项目
static class NativeFunctions
{
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern IntPtr OpenFileMapping(
        uint dwDesiredAccess, 
        bool bInheritHandle,
        string lpName);
}

然后我们可以检查该部分是否已创建,并根据该部分决定是否正在监听。

编写这个简单的程序

public const int FILE_MAP_READ = 0x0004;
static void Main(string[] args)
{
    if (NativeFunctions.OpenFileMapping(FILE_MAP_READ, false, "DBWIN_BUFFER") != IntPtr.Zero)
    {
        Log("Someone is listening");
    }
    else
    {
        Log("I am here alone");
    }
}

private static void Log(string log)
{
    Debug.WriteLine(log);
    Console.WriteLine(log);
}

在没有DebugView的情况下跑步时,我们得到“我一个人在这里”

enter image description here

并使用工具

enter image description here

另外澄清事情“..当System.Diagnostics.Debug.WriteLine写入内部跟踪侦听器时。” Debug.WriteLine也将写入与OutputDebugString相同的位置,但仅在未附加VS的情况下 - 否则VS将捕获日志并发布到其“输出”窗口。