我需要检查OutputDebugString / System.Diagnostics.Debug.WriteLine的输出是否会永远不会降落。
似乎OutputDebugString是一个本机方法,而System.Diagnostics.Debug.WriteLine正在写入内部跟踪侦听器。
是Debugger.IsAttached对此进行了充分的检查吗?
Debugger.IsAttached似乎没有像DebugView这样的东西运行。我需要能够检查ANYTHING是否会看到OutputDebugString / System.Diagnostics.Debug.WriteLine的输出。
答案 0 :(得分:2)
如果你愿意亲自动手并使用一些原生的东西,你就可以做到这一点。你需要使用P / Invoke。
OutputDebugString
,正如您可以阅读here,基于4个内核对象。 Mutex
名为DBWinMutex
,共享内存DBWIN_BUFFER
和两篇事件(DBWIN_BUFFER_READY
和DBWIN_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的情况下跑步时,我们得到“我一个人在这里”
并使用工具
另外澄清事情“..当System.Diagnostics.Debug.WriteLine写入内部跟踪侦听器时。” Debug.WriteLine
也将写入与OutputDebugString
相同的位置,但仅在未附加VS的情况下 - 否则VS将捕获日志并发布到其“输出”窗口。