【问题标题】:Check if application was started from within Visual Studio debug session检查应用程序是否从 Visual Studio 调试会话中启动
【发布时间】:2008-09-19 13:29:07
【问题描述】:

我正在开发一个安装系统范围键盘的应用程序 钩。我不想在运行调试时安装这个钩子 从视觉工作室内部构建(否则它会挂起工作室 最终是系统),我可以通过检查是否 已定义 DEBUG 符号。

但是,当我调试 release 版本的应用程序时,是 有一种方法可以检测到它是从内部视觉开始的 工作室避免同样的问题?不得不这样做很烦人 重启工作室/电脑,只是因为我一直在工作 发布版本,并希望使用调试器修复一些错误 忘记切换回调试版本。

目前我使用这样的东西来检查这种情况:

System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
string moduleName = currentProcess.MainModule.ModuleName;
bool launchedFromStudio = moduleName.Contains(".vshost");

我将其称为“蛮力方式”,它适用于我的设置,但我想知道是否有另一种(更好的)方式来检测这种情况。

【问题讨论】:

  • 注意:在尝试从 Visual Studio 测试启动并通过在 IIS Express 下运行的代码时,我得到了以下字符串。因此,任何阅读本文的人都可能需要相应地调整代码。

标签: visual-studio debugging


【解决方案1】:

【讨论】:

  • (更新的评论) Debugger.IsAttached 足够了,可以满足许多要求。但是,它仅解决是否附加了调试器(任何调试器,包括 WinDbg)。如果在没有调试的情况下在 IDE 中运行,它不会总是像宣传的那样工作。 OP 的建议代码是确定程序是否在 IDE 中运行的最佳方法。注意:CodedUI 测试不使用“vshost”。相反,他们使用 QTAgent.exe、QTAgent32.exe 和 QTAgent64.exe 等。所以使用moduleName.ToLower.Contains("qtagent");
  • @Barniferous,看起来从 VS 2017 开始检查“.vshost”不再有效,因为 VS 2017 已停止将其添加到名称中。我不知道 CodedUI 测试是做什么的......
【解决方案2】:

对于那些使用 Windows API 的人,有一个函数可以让您查看是否存在任何调试器:

if( IsDebuggerPresent() )
{
    ...
}

参考:http://msdn.microsoft.com/en-us/library/ms680345.aspx

【讨论】:

【解决方案3】:

测试当前进程的模块名称是否包含字符串“.vshost”是我发现确定应用程序是否在 VS IDE 中运行的最佳方法。

使用 System.Diagnostics.Debugger.IsAttached 属性也可以,但它无法区分您是否通过 VS IDE 的 Run 运行 EXE em> 命令,或者如果您直接运行调试版本(例如,使用 Windows 资源管理器或快捷方式),然后使用 VS IDE 附加到它。

你知道我曾经遇到过一个问题,与(COM 相关)数据执行保护错误,需要我运行一个 构建后事件来执行 editbin .exe 与 VS 生成的 EXE 上的 /NXCOMPAT:NO 参数。

由于某种原因,如果您只是按 F5 并运行程序,则 EXE 没有被修改,因此在违反 DEP 时会发生 AccessViolationExceptions如果从 VS IDE 中运行代码 - 这使得调试非常困难。但是,我发现如果我通过快捷方式运行生成的 EXE,然后附加 VS IDE 调试器,我就可以在不发生 AccessViolationExceptions 的情况下测试我的代码。

所以现在我创建了一个使用“vshost”方法的函数,如果我只是在 VS IDE 中进行日常编程,我可以使用它来警告或阻止某些代码运行。

这可以防止那些讨厌的 AccessViolationExceptions 被引发,从而在我无意中尝试运行我知道会导致我悲伤的东西时使我的应用程序致命地崩溃。

【讨论】:

  • 对了,也别忘了远程调试,Visual Studio以外的其他调试器等等。
  • 查看我在 OP 帖子下的评论,如果您启动测试或 IIS express 项目,您会得到不同的模块名称。
  • 我以前也检查“.vshost”,但现在看起来从 VS 2017 开始检查“.vshost”不再有效,因为 VS 2017 已停止将其添加到名称中。我偶然发现了这个线程,正在寻找一种从 VS 检测调试的新方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多