如何检测是不是调试

Posted

技术标签:

【中文标题】如何检测是不是调试【英文标题】:How to detect if debugging如何检测是否调试 【发布时间】:2021-08-03 22:15:39 【问题描述】:

我有一个 .Net Core 控制台应用程序。在我的 startup.cs 的配置方法中,我试图测试是否启用了调试器:

 if (HttpContext.Current.IsDebuggingEnabled)
     loggerFactory.AddConsole(Configuration);
 else
     loggerFactory.AddConsoleJson(Configuration);

HttpContext.Current.IsDebuggingEnabled 不支持 .Net 核心。我还没有找到适用于 .net core 的方法。

System.Diagnostics.DebuggableAttribute.DebuggingModes.Default 似乎也不起作用。

【问题讨论】:

请反对的选民介意发表评论。我很高兴改进这个问题,以便将来帮助其他人。 这能回答你的问题吗? Is there a way to detect if a debugger is attached to another process from C#? 【参考方案1】:

HttpContext 是另一个 HttpContext,因为您现在使用的是 ASP.NET Core。在 ASP.NET Core 变体中找不到该属性。 poke 给出了差异的解释。

我会使用Debugger.IsAttached,它不仅会检查是否启用了调试,还会主动进行调试。

【讨论】:

我建议你修正你对HttpContext 的评论,因为你显然错过了这个问题是关于 ASP.NET Core 的,它通常一个控制台应用程序。 HttpContext.Current不起作用的原因是另一回​​事。 你是对的。人们经常将 .NET Standard 和 .NET Core 混合在一起,所以我认为 OP 也是如此。我更新了我的答案。 @poke 你的权利。我总是忘记这一点。如果您有兴趣,它是来自我的身份服务器的代码。我还是 .net core 的新手【参考方案2】:

HttpContext.Current 指的是 System.Web.HttpContext,它是旧 ASP.NET 中使用的 System.Web 命名空间的一部分。

ASP.NET Core 不使用 System.Web 命名空间中的类型,并且在旧 ASP.NET 世界中应用的任何内容都需要重新评估它是否仍然适用于 Microsoft.AspNetCore 命名空间中的适当新类型。

对于HttpContext,新类型是Microsoft.AspNetCore.Http.HttpContext。但是,它没有IsDebuggingEnabled 的the old type had 属性。

原因是旧的 ASP.NET 是在 Web 服务器(最常见的是 IIS)中运行的应用程序,并且该 Web 服务器向应用程序提供 HttpContext。所以你必须使用HttpContext.Current 来访问那个上下文。

然而,在 ASP.NET Core 中,应用程序包括网络服务器,使得 ASP.NET Core 应用程序能够完全独立于它运行。现在,在使用 ASP.NET Core 进行调试时,您现在不是附加到父 Web 服务器,而是附加到 ASP.NET Core 应用程序本身的进程。这也是您通常创建命令行应用程序(包含带有应用程序代码的网络服务器)的原因。由于它们是普通(命令行)应用程序,因此您必须使用标准工具来确定是否附加了调试器。

通常的方法是检查Debugger.IsAttached

if (Debugger.IsAttached)

    // debugger is attached

但是,请注意,调试器不需要在应用程序启动时立即附加。稍后仅在应用程序已经运行时附加调试器是完全可以的。这很重要,因为StartupWebHostBuilder 中的代码只会在应用程序启动时运行一次。因此,即使附加了调试器,注册您的日志记录提供程序的代码也可能在调试器尚未附加的时候运行。

【讨论】:

【参考方案3】:

如果你想在Debug而不是Release中运行一段代码,你可以使用#if预处理指令。

#if(DEBUG)
  debug code here...
#else
  release code here...
#endif

如果您不想在构建的发布版本中运行任何内容,请不要包含 else 块。

【讨论】:

这适用于 DEBUG 与 RELEASE 构建,并在编译时而不是运行时进行检查。附加调试器与使用调试符号构建之间存在巨大差异。

以上是关于如何检测是不是调试的主要内容,如果未能解决你的问题,请参考以下文章

简述-gdb检测apk是不是可以被调试

检测 qt 是不是在运行时运行调试构建

Cordova:无论如何,是不是可以在 Javascript 中检测 iOS 应用程序是作为调试版还是作为发布版构建的?

检测 iOS 应用程序是不是在发布版本的调试器中运行

有没有办法检测附加的调试器是不是是远程调试器?

检测 iOS 应用程序是不是在调试器中运行