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

标签 c windows-7 batch-file

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

我的 C 程序使用 ExitProcess 将错误级别传回批处理文件。有时在 Windows 7(Microsoft Windows [版本 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

程序级别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);
    }

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

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86

Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

cl /MT level250.c

其他信息:我也试过在 JPSoft 的 TCC 下运行并获得与使用 CMD 相同的行为。我使用的是直接的 .c 程序,而不是 .cpp。我在单线程版本中没有看到任何失败。我将源代码和二进制文件放在 http://jcook.info/win7fail 上压缩文件 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);
    }

最佳答案

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

也可以尝试调用调试器,或在进程意外终止时加载核心转储。

关于c - 为什么我不能在 Windows 7 中测试返回码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3294947/

相关文章:

java - ant - 尝试复制到/lib/endorsed,库在 Windows 7 中无法用于下一个任务

windows - 如何使用批处理文件查找Windows的安装位置

c - 寻找一种在 C 中调用具有不同参数的函数的方法

c - .C 到 R 的接口(interface)

c++ - 将 argv 复制到 char 数组时出错

c# - C#程序集的代码签名证书

c 函数指针

windows-7 - 在 Windows 7 上安装 Python 27 时出现问题 - 无法将 Python 添加到 PYTHON PATH

windows - robocopy 导致成功退出(1)

windows - vbscript 找不到存储在谷歌驱动器中的批处理文件