我正在尝试编写小型调试器。我的简化代码是
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 failed.LastError = 50”。错误50是ERROR_NOT_SUPPORTED(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx)。这可能是什么原因?我如何调试所有类型的二进制文件?
答案 0 :(得分:5)
您将无法使用非托管调试程序来调试托管可执行文件。查看MDbg sample以查看需要采取的措施。
然而,ERROR_NOT_SUPPORTED错误并不是托管可执行文件所独有的,尽管更有可能的是,当您尝试使用32位调试器调试64位可执行文件时,也会获得它。将x64平台目标添加到项目中以构建它的64位版本。
答案 1 :(得分:0)
这是因为您使用的是CreateProcess而不是CreateProcess。切换到UNICODE版本(你应该总是在新的应用程序中使用它。):
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());