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

CreateProcess with DEBUG_PROCESS flag causes error 50 on some executables

本文关键字:可执行文件 错误 PROCESS DEBUG 标志 CreateProcess 带有      更新时间:2023-10-16

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

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)。造成这种情况的原因是什么?如何调试所有类型的二进制文件?

非托管调试器调试托管可执行文件的用处不大。查看MDbg示例,看看需要什么。

然而,ERROR_NOT_SUPPORTED错误并不是托管可执行文件独有的,尽管更可能的是,当您尝试使用32位调试器调试64位可执行文件时也会出现此错误。将x64平台目标添加到您的项目中,以构建其64位版本。