为什么我不能在Windows 7中测试返回码?

piC*_*kie 5 c batch-file windows-7

我有一个非常复杂的程序失败了,我已经将它简化为带有批处理文件和C程序的测试集.

我的C程序使用ExitProcess将errorlevel传递回批处理文件.有时在Windows 7(Microsoft Windows [Version 6.1.7600])上,错误级别未正确解释.

我认为这应该永远运行.在Windows XP上,它似乎永远运行.在两台不同的双核Windows 7机器(一台64位,一台32位)上,它会在几分钟内失败.

我无法想象我做错了什么,但是如果在Windows 7上有一些关于ExitProcess的搞笑,我想我会问.这里有什么我非法做过的吗?

cmd.exe的批处理文件test.bat:

@ECHO OFF
SET I=0
:pass
SET /A I=I+1
Title %I%
start/wait level250
if errorlevel 251 goto fail
if errorlevel 250 goto pass
:fail
Run Code Online (Sandbox Code Playgroud)

程序级别250.c:

#include "windows.h"

static volatile int Terminate = 0;

static unsigned __stdcall TestThread(void * unused)
    {
    Terminate = 1;
    return 0;
    }

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
    {
    CreateThread(NULL, 0, TestThread, NULL, 0, NULL);

    while (Terminate == 0) Sleep(1);
    ExitProcess(250);
    }
Run Code Online (Sandbox Code Playgroud)

我的编译器版本和调用是:

用于80x86的Microsoft(R)32位C/C++优化编译器版本12.00.8804

版权所有(C)Microsoft Corp 1984-1998.版权所有.

cl/MT level250.c

其他信息:我也尝试在JPSoft的TCC下运行,并获得与使用CMD相同的行为.我使用的是直接的.c程序,而不是.cpp.我没有在单线程版本中看到任何失败.我把源和二进制文件放在http://jcook.info/win7fail上,zip文件MD5是579F4FB15FC7C1EA454E30FDEF97C16B,CRC32是C27CB73D.

编辑建议后,我进一步改变了测试用例,仍然看到了失败.在我们的实际应用中,有数百个线程.一些线程以各种重要的返回码退出,一些线程永远运行,一些线程挂在操作系统调用或dll中,并且很难(如果不是不可能)杀死.

#include "windows.h"

static unsigned __stdcall TestThread(void * unused)
    {
    return 0;
    }

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
    {
    CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
    return(250);
    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*ner 1

打印返回代码的实际内容。无法保证如果出现问题,您会得到您期望的 251 和 250,例如由于分段错误或您不知道的其他错误。此外,我看不到你在代码中返回 251 的位置。警惕高退出代码,我相信 255 是安全的可移植限制,在某些系统上它可能小于 64,或 <= 127。(这可能无关紧要,因为您显然使用的是 Windows,但值得注意。)

还可以尝试调用调试器,或在进程意外死亡时加载核心转储。