首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有DEBUG_PROCESS标志的CreateProcess在某些可执行文件上导致错误50

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

Stack Overflow用户
提问于 2013-11-25 18:38:47
回答 2查看 2.9K关注 0票数 4

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-11-25 21:40:49

使用非托管调试器调试托管可执行文件不会有多大用处。查看MDbg sample,看看这需要做些什么。

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

票数 5
EN

Stack Overflow用户

发布于 2013-11-25 22:51:36

这是因为您使用的是CreateProcessA而不是CreateProcessW。切换到UNICODE版本(顺便说一下,您应该始终在新应用程序中使用它):

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20189999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档