16

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

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

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

4

3 回答 3

25

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

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

您可以通过添加注册表项来禁用特定可执行文件的 PCA。对于 Windows 7,相应的注册表项是HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant. 在 regedit 中,右键单击该键,选择New-> Multi-String Value,将其命名为ExecutablesToExclude。将值设置为 and 的完整路径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 或命令行)运行的可执行文件可能会在兼容模式下运行,并再次获得围绕它们的作业对象。为防止这种情况,您的可执行文件需要使用新的应用程序清单兼容性部分声明与 Windows 7 的兼容性的清单。该链接提供了一个 Windows 7 兼容清单的示例。Visual Studio 2010 提供的默认清单不包括此兼容性部分。

于 2010-11-20T10:25:41.767 回答
1

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

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

于 2008-09-18T14:32:06.150 回答
1

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

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

于 2008-09-18T14:51:08.410 回答