【问题标题】:How to stop the Visual Studio debugger starting my process in a job object?如何停止 Visual Studio 调试器在作业对象中启动我的进程?
【发布时间】:2010-09-10 12:39:02
【问题描述】:

当我从 Visual Studio 开始我的流程时,它总是在作业对象中创建。我想知道如何关闭这种行为。有什么想法吗?

我希望它是在要调试的作业对象中创建的。我想将我的程序放在不同的作业对象中。

这不是托管过程。我说的是Job Object。这是一个非托管 C++ 应用程序。

【问题讨论】:

  • 您的流程所在的作业对象是 Visual Studio 所在的一个。我不知道如何或是否可以将 Visual Studio 配置为使用 CREATE _ BREAKAWAY _ FROM _ JOB 生成您的流程标志。
  • 为什么需要它,为什么程序本身不适合检测它何时没有在正确的“工作”中运行并自行脱离?
  • 工作一旦开始就不能脱离工作
  • 我们与以前版本的 Visual Studio 有相同的行为。至少在 VS 2017 中,该过程不再是工作的一部分。 IsProcessInJob 现在报告 FALSE。

标签: visual-studio visual-studio-2005 debugging


【解决方案1】:

我不知道有任何方法可以控制 VS.NET 为调试而生成的进程的这一方面。但是有一个解决方法,它适用于 VS.NET 不能或不能以您想要的确切方式启动您的进程的任何情况:

启动您的进程(可能使用作为构建后事件的一部分运行的包装 EXE),然后使用工具/附加到进程附加到新启动的进程。如果您将调试器作为启动代码的一部分闯入,则甚至不需要这样做(您还可以调试启动问题...)。

【讨论】:

  • 在项目的调试选项中有一个“附加到进程”选项,这将使调试更加无缝。 [无论哪种方式,如果进程 [比如说命令行实用程序] 是非交互式的并且在您可以附加到它之前完成......#ifdef DEBUG FTW!]
  • 无所谓,其实这个问题不管是不是在调试器中启动的进程都会出现,只要是从Visual Studio启动就可以了。不过感谢您的建议。
【解决方案2】:

我无法重现您所看到的内容。我在 VS 2005 和 VS 2008 中都创建了一个非托管 C++ 应用程序,并且在 VS 中启动该进程时,将该进程关联到一个新的作业对象没有问题。

您确定调试器正在这样做吗?

【讨论】:

  • 毫无疑问。我可以在 Process Explorer 中看到它是在包含 devenv 的作业中启动的。如果我从命令行启动它,那么它启动时就没有工作。
【解决方案3】:

devenv.exeVSLauncher.exe 在兼容模式下运行时会发生这种情况。 Program Compatibility Assistant (PCA) 将作业对象附加到 Visual Studio 进程,每个子进程都继承它。检查作业名称(由 Process Explorer 报告)是否以 PCA 开头。如果是这样,可以按照链接中的说明禁用 PCA。

您可以使用Run -> gpedit.msc -> Administrative Templates\Windows Components\Application Compatibility -> Turn off Program Compatibility Assistant -> Enable 全局禁用 PCA。

您可以通过添加注册表项来禁用特定可执行文件的 PCA。对于 Windows 7,相应的注册表项是 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant。在 regedit 中,右键单击该键,选择 New -> Multi-String Value,将其命名为 ExecutablesToExclude。将值设置为 denenv.exeVSLauncher.exe 的完整路径,在单独的行中且不带引号。对我来说,这些是:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe
C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\VSLauncher.exe

在 Windows 7 上的一个相关问题是,您在 Visual Studio 中构建并从资源管理器(不是 Visual Studio 或命令行)运行的可执行文件可能在兼容模式下运行,并再次获得围绕它们的作业对象。为防止这种情况,您的可执行文件需要使用新的Application Manifest Compability section 声明与 Windows 7 兼容的清单。该链接提供了一个 Windows 7 兼容清单的示例。 Visual Studio 2010 提供的默认清单不包括此兼容性部分。

【讨论】:

  • 谢谢,这听起来很有趣。显然我不再遭受这个问题了,但如果其他人是这可以帮助他们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2013-08-06
  • 1970-01-01
  • 2016-08-16
  • 2014-01-16
  • 1970-01-01
相关资源
最近更新 更多