无法使用 Visual Studio 2005 附加到创建的进程
Posted
技术标签:
【中文标题】无法使用 Visual Studio 2005 附加到创建的进程【英文标题】:Unable to attach to created process with Visual Studio 2005 【发布时间】:2010-01-08 10:19:17 【问题描述】:我在附加到由我自己的进程之一生成的进程时遇到问题。当我尝试使用 Visual Studio 2005(调试 -> 附加到进程)附加到进程时,我收到错误消息:“无法附加到进程。系统找不到指定的文件。”
在我的程序中,我生成了稍后我想使用命令附加到的进程
BOOL res = CreateProcess(exe, cmdLine, NULL, NULL, FALSE, 0, NULL,
workingDir, &startupInfo, &procInfo);
如果我从命令提示符手动启动第二个进程,我可以毫无问题地附加到它。我也可以使用 WinDbg 附加到它,而不是 Visual Studio 2005。我是从 VS 中启动第一个进程(因此以管理员身份运行)还是从命令提示符启动它没有区别作为普通用户。我在 Vista 64 位下以管理员身份运行 Visual Studio,并且可执行文件都是 64 位的。
有没有人以前看过这个或者对我可能做错了什么有任何想法?任何帮助表示赞赏。
更新: 我还尝试使用以下代码为新进程和线程设置安全属性:
DWORD dwRes, dwDisposition;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld =
SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;
LONG lRes;
HKEY hkSub = NULL;
// Create a well-known SID for the Everyone group.
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0, &pEveryoneSID))
...
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = GENERIC_ALL;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
// Create a SID for the BUILTIN\Administrators group.
if(! AllocateAndInitializeSid(&SIDAuthNT, 2, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSID))
...
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow the Administrators group full access to
// the key.
ea[1].grfAccessPermissions = GENERIC_ALL;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;
// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes)
...
// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
...
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
...
// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE))
...
// Initialize a security attributes structure.
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;
CreateProcess(exe, cmdLine, &sa, &sa, ...
没有运气。
更新:我还可以使用 Visual Studio 2008(仍然使用 VS2005 编译)附加到进程,这解决了我的迫切需求。由于这是在 Vista x64 下,这里会不会有某种形式的“Vista 魔法”在起作用,而 VS2005 不能与 Vista 配合得很好?为什么只有我从我无法真正理解的代码构建和启动的进程才会出现这种情况......
【问题讨论】:
你能附加到其他进程吗? 是的,我可以附加到我以相同方式启动的其他进程(如 notepad.exe)。只是不是我的 exe,无论我是在发布模式还是调试模式还是 32/64 位构建。 【参考方案1】:我在 Win7 上遇到了同样的错误。我解决了。 我试图通过附加到正在运行的服务进行远程调试。然后我终于发现我需要以管理员身份运行msvcmon。
【讨论】:
+1:虽然这不是对OP问题中具体情况的回答,但它可能对其他有类似问题的人有所帮助(欢迎使用SO)【参考方案2】:好的,我终于找到了导致这个问题的原因。我会在此处发布以防其他人遇到此问题(由于答案稀缺,我猜这并不常见,但是嘿...)。
问题在于用于启动可执行文件的路径包含一个由单个点组成的路径元素,如下所示:
c:\dir1\.\dir2\program.exe
这显然让 VS2005 去寻找可执行文件
c:\dir1\dir1\dir2\program.exe
那当然不存在...谢谢马克Process Monitor!删除 .使附加到流程再次按预期工作。
【讨论】:
【参考方案3】:我认为您需要正确定义命名为 SECURITY_ATTRIBUTES 你把它作为这个 NULLs CreateProcess(exe, cmdLine, NULL, NULL, 在这种情况下,它们由系统定义 并且可能使用 VS 权限定义 而且VS显然不允许调试自己的进程;)
【讨论】:
我更新了关于我尝试设置安全属性的初始帖子,不幸的是这似乎没有帮助......您是正确的,将使用默认安全属性,但是没有区别在我是从 VS 中还是从命令提示符启动第一个进程之间,所以我不认为这是附加到由 VS 本身启动的进程的问题。以上是关于无法使用 Visual Studio 2005 附加到创建的进程的主要内容,如果未能解决你的问题,请参考以下文章
无法让 SQL Server CE 与 Visual Studio 2005 和 Windows CE 5.0 一起使用
Visual Studio2005问题:未能正确加载包“Visual Studio Macros Package”
如何在 Visual Studio 2005 中进行单元测试?
visual studio 2005 生成出来的exe无法执行??