具有DEBUG_PROCESS标志的CreateProcess在某些可执行文件上导致错误50

我正在尝试编写小型debugging器。 我简化的代码是

STARTUPINFOA sui; ZeroMemory( &sui, sizeof(sui) ); sui.cb = sizeof(sui); PROCESS_INFORMATION pi; ZeroMemory( &pi, sizeof(pi) ); DWORD dwFlags = DEBUG_PROCESS; string program = "program.exe"; if (! CreateProcessA(NULL, (char*) program.c_str(), NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi)) printf("%s failed. LastError = %d", program.c_str(), GetLastError()); 

在大量的可执行文件,它工作正常。

但是,例如在C#编译的可执行文件上,这段代码输出“program.exe失败,LastError = 50”。 错误50是ERROR_NOT_SUPPORTED( http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382 (v=vs.85) .aspx )。 这可能是什么原因? 我如何debugging所有types的二进制文件?

对于非托管调试器来调试托管可执行文件没有多大用处。 查看MDbg示例以了解需要什么。

然而,ERROR_NOT_SUPPORTED错误并不是被管理的可执行文件所独占的,尽管更可能的是,当您尝试使用32位调试器来调试64位可执行文件时,也会得到该错误。 将x64平台目标添加到您的项目以构建它的64位版本。

这是因为您正在使用CreateProcessA而不是CreateProcessW。 切换到UNICODE版本(你应该总是使用它在新的应用程序btw。):

 STARTUPINFOW sui; ZeroMemory(&sui, sizeof(sui)); sui.cb = sizeof(sui); PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); DWORD dwFlags = DEBUG_PROCESS; wchar_t *program = L"c:\\temp\\test.exe"; if (!CreateProcessW(NULL, program, NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi)) wsprintf(L"%s failed. LastError = %d", program, GetLastError());