2010-01-08 52 views
0

我附加到從我自己的進程中產生的進程問題。當我嘗試使用Visual Studio 2005(調試 - >附加到進程)附加到進程時,收到錯誤消息:「無法附加到進程,系統找不到指定的文件。」無法附加到使用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中不會很好嗎?爲什麼這是隻爲我建立的,並從我的代碼開始我真的不能明白流程,我認爲你需要正確地定義如此命名SECURITY_ATTRIBUTES
的情況下...

+0

你能夠附加到其他進程嗎? – avakar 2010-01-08 12:08:23

+0

是的,我可以附加到其他進程(如notepad.exe),我已經開始以相同的方式。只是不是我的exe文件,無論我是否在發佈或調試模式或32/64位構建。 – villintehaspam 2010-01-12 18:49:32

回答

2

好吧,我終於發現了什麼造成了這個問題。我會在這裏發佈它,以防其他人遇到這種情況(從我認爲這不是那麼常見的答案的稀缺性,但嘿...)。

的問題是,用於啓動可執行文件的路徑包含由單個點的路徑元素,像這樣:

c:\dir1\.\dir2\program.exe 

這顯然作出VS2005去尋找一個可執行文件在

c:\dir1\dir1\dir2\program.exe 

那當然不存在...謝謝馬克的Process Monitor!刪除。如預期的那樣重新進行過程工作。

-1

你給它,因爲這NULL值的CreateProcess(EXE ,CMDLINE,NULL,NULL,
因爲在這種情況下,他們定義了系統 並可能與VS權限
和VS不允許明顯調試自己的流程定義;)

+0

我更新了關於設置安全屬性的嘗試的初始文章,這很不幸似乎沒有幫助...您使用默認安全屬性是正確的,但是我是否已啓動從VS內部或從命令提示符開始的第一個進程,所以我不認爲這是附加到由VS本身啓動的進程的問題。 – villintehaspam 2010-01-08 10:42:37

4

我對Win7有同樣的錯誤。我解決了它。 我試圖通過附加到正在運行的服務進行遠程調試。然後我終於發現我需要以管理員身份運行msvcmon。

+2

+1:雖然它不是OP中問題的具體情況的答案,但它可能對有類似問題的其他人有幫助(並歡迎SO) – rlc 2011-05-19 00:57:23

相關問題