我正在尝试写一个小的调试器。我的简化代码是
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。造成这种情况的原因是什么?如何调试所有类型的二进制文件?
发布于 2013-11-25 21:40:49
使用非托管调试器调试托管可执行文件不会有多大用处。查看MDbg sample,看看这需要做些什么。
但是,ERROR_NOT_SUPPORTED错误并不是托管可执行文件所独有的,尽管更有可能的是,当您尝试使用32位调试器调试64位可执行文件时,也会遇到该错误。将x64平台目标添加到您的项目中,以构建其64位版本。
发布于 2013-11-25 22:51:36
这是因为您使用的是CreateProcessA而不是CreateProcessW。切换到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());https://stackoverflow.com/questions/20189999
复制相似问题