是否有一个等同于IsDebuggerPresent()的C#?

时间:2012-09-14 09:59:26

标签: c#

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

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

3 个答案:

答案 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。

最后,这一切都取决于你想要实现的目标。