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

Posted

技术标签:

【中文标题】带有 DEBUG_PROCESS 标志的 CreateProcess 在某些可执行文件上导致错误 50【英文标题】:CreateProcess with DEBUG_PROCESS flag causes error 50 on some executables 【发布时间】:2013-11-25 10:38:46 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

非托管调试器在调试托管可执行文件时没有多大用处。查看MDbg sample 看看需要什么。

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

【讨论】:

现在我用托管调试器检查想法,谢谢!不,所有代码都是 32 位的。 汉斯,我可以从非托管 C++ 调用托管调试器还是它不真实?【参考方案2】:

这是因为您使用的是 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());

【讨论】:

当然我使用了 Unicode 函数,但为了简化我将其更改为它们的 ANSI 变体。 我粘贴的代码你试过了吗?我没有得到 ERROR_NOT_SUPPORTED。 是的,我在代码上遇到同样的错误:wchar_t program[1024] = TEXT("Program.exe"); if (! CreateProcessW(NULL, program, NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi)) wsprintf(L"%s failed. LastError = %d", program, GetLastError());这是我的 C# 编译的二进制文件:dl.dropboxusercontent.com/u/5342245/Program.exe Program.exe 是刚刚编译好的程序:dl.dropboxusercontent.com/u/5342245/Program.cs

以上是关于带有 DEBUG_PROCESS 标志的 CreateProcess 在某些可执行文件上导致错误 50的主要内容,如果未能解决你的问题,请参考以下文章

带有标志的 Html 国家/地区列表 [关闭]

如何在 Bash 中获取带有标志的参数

带有“允许同源”标志错误的 iframe 沙盒

国家/地区的 Select2 下拉菜单,带有标志

带有 Eigen 和 IPOPT 的矢量化标志

带有“#”的 Clang 诊断标志会导致构建错误