为什么我不能在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 程序级别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,TestThread,NULL,NULL); while (Terminate == 0) Sleep(1); ExitProcess(250); } 我的编译器版本和调用是:
其他信息:我也尝试在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,NULL); return(250); } 解决方法
打印返回代码实际上是什么.无法保证如果出现问题,您将获得所期望的251和250,例如通过分段错误或其他您不知道的错误.此外,我无法在您的代码中看到您返回251的位置.警惕高退出代码,我认为255是安全的可移植限制,在某些系统上它可能小于64,或者<= 127.(这可能无关紧要,因为你显然使用的是Windows,但值得注意.) 还尝试调用调试器,或在进程意外死亡时加载核心转储.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在调用.net com dll时强制VB6编译器使用早期绑定
- windows-server-2003 – 确定谁以管理员权限运行
- windows-runtime – Windows Phone 8.1中的Image
- windows环境下elasticsearch安装教程(超详细)
- windows-phone-7 – jQuery Mobile changePage()
- windows – 如何阻止Internet Explorer跟踪在OTH
- Windows下编译PHP5.4和xdebug全记录
- Windows – 如何使用批处理脚本从.properties文件
- windows-server-2003 – 将Active Directory从20
- Windows 8.1应用中的Google Admob