18

我确实找到了这个代码片段,但是在调试时它没有返回 true:

[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
internal static extern bool IsDebuggerPresent();
4

3 回答 3

36

是的:

System.Diagnostics.Debugger.IsAttached
于 2012-09-14T10:00:34.617 回答
7

您标记了您的问题,C#因此我假设在说“但是当我在调试时它不会返回 true”时,您实际上是在谈论托管调试。

IsDebuggerPresent()函数检查是否存在本机调试器。在您的情况下,您应该使用System.Diagnostics.Debugger.IsAttached检查是否存在(托管)调试器。

另请参阅此博客文章以获取有关调试器 API 的更多信息。

于 2012-09-14T10:03:24.230 回答
2

.NET Framework 中IsDebuggerPresent()最像的成员显然是.NET Debugger.IsAttached,但它们的内部工作方式完全不同,就像Debugger.Log工作方式与简单的工作方式大不相同一样OutputDebugString

  • Debugger.IsAttached向 CLR 询问是否存在附加的托管调试器,甚至从不费心检查是否存在本机调试器。
  • IsDebuggerPresent()询问内核是否存在附加的本机调试器,并且对托管调试器一无所知。

从 Visual Studio 2013 开始,托管调试器构建在本机调试器之上,因此在 VS 下调试托管应用程序时,两者都应该返回 true IsDebuggerPresent()Debugger.IsAttached但是,如果您碰巧将 Visual Studio 附加到托管应用程序并将代码类型显式覆盖为本机,IsDebuggerPresent()则将返回 true,但Debugger.IsAttached仍返回 false。

最后,这一切都归结为您要实现的目标。

于 2014-11-07T09:46:47.613 回答