我确实找到了这段代码片段,但在调试时它没有返回true:
[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
internal static extern bool IsDebuggerPresent();
答案 0 :(得分:33)
是:
System.Diagnostics.Debugger.IsAttached
答案 1 :(得分:5)
您将问题标记为C#
,所以我在假设“当我正在调试时它不会返回时”,您实际上是在谈论托管调试。
IsDebuggerPresent()
函数检查是否存在本机调试器。在您的情况下,您应该使用System.Diagnostics.Debugger.IsAttached
来检查是否存在(托管)调试器。
有关调试器API的更多信息,请参阅this blog post。
答案 2 :(得分:1)
最接近IsDebuggerPresent()
的.NET Framework成员显然是Debugger.IsAttached
,但他们的内部工作完全不同,就像Debugger.Log
与简单OutputDebugString
的工作方式完全不同}}
Debugger.IsAttached
要求CLR存在附件
管理调试器,甚至从来没有检查是否存在
本机调试器。 IsDebuggerPresent()
要求内核存在附加的本机调试器,并且不了解托管调试器。从Visual Studio 2013开始,托管调试器构建在本机调试器之上,因此在VS下调试托管应用程序时,IsDebuggerPresent()
和Debugger.IsAttached
都应返回true。但是,如果您碰巧将Visual Studio附加到托管应用程序并显式覆盖代码类型为原生代码,IsDebuggerPresent()
将返回true,而Debugger.IsAttached
仍然返回false。
最后,这一切都取决于你想要实现的目标。