如何停止Visual Studio调试器在作业对象中启动我的进程?

时间:2020-03-06 14:19:52  来源:igfitidea点击:

当我从Visual Studio启动过程时,总是在作业对象中创建过程。我想知道如何关闭此行为。有任何想法吗?

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

这不是托管过程。我说的是工作对象。这是一个不受管理的C ++应用程序。

解决方案

我不知道有什么方法可以控制由VS.NET调试产生的进程的这一方面。但是有一种解决方法,它适用于VS.NET无法或者无法以我们想要的确切方式启动进程的任何情况:

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

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

我们确定调试器正在执行此操作吗?

devenv.exe或者VSLauncher.exe在兼容模式下运行时,会发生这种情况。程序兼容性助手(PCA)将作业对象添加到Visual Studio进程,并且每个子进程都继承它。检查作业名称(由Process Explorer报告)是否以PCA开头。如果是这样,可以按照链接中所述禁用PCA。

我们可以使用"运行"->" gpedit.msc"->"管理模板\ Windows组件\应用程序兼容性"->"关闭程序兼容性助手"->"启用"全局禁用PCA。

我们可以通过添加注册表项来禁用特定可执行文件的PCA。对于Windows 7,适当的注册表项是" HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Compatibility Assistant"。在regedit中,右键单击该键,选择"新建"->"多字符串值",将其命名为" ExecutablesToExclude"。将值设置为" denenv.exe"和" VSLauncher.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或者命令行)可能会在兼容模式下运行,并再次使作业对象缠绕在它们周围。为防止这种情况,可执行文件需要使用新的"应用程序清单兼容性"部分来声明与Windows 7兼容的清单。该链接提供了Windows 7兼容清单的示例。 Visual Studio 2010提供的默认清单不包括"兼容性"部分。