退出无法设置错误代码

n. *_* m. 7 c++ windows exit-code windows-server-2008

我有一个C++ Windows程序无法设置退出代码.该程序非常复杂,我目前无法通过简单的测试用例重现这一点.我知道程序调用exit(1)因为我在该行上有一个断点.在我跳过它之后,调试器(VS2010)立即打印The program program.exe has exited with code 0 (0x0).当我从shell运行它时,%ERRORLEVEL%也设置为0.

我使用subsystem:console和普通main(没有WinMain).

这仅发生在Windows Server 2008 R2上,而不是在我的Windows 8.1笔记本电脑上.我在两者上运行相同的可执行文件.

我曾尝试使用exit,_exit,ExitProcess,和return(违规通话中main),但这些都不似乎有什么影响.我也试图返回其他代码,也没有结果.

有一个类似的问题,但我无法重现其中描述的结果.我的程序确实使用线程.

我该如何处理调试此问题?我很困惑.

Han*_*ant 11

我试图使用exit,_exit,ExitProcess和return

您已经消除了所有合理的解释,特别是使用ExitProcess().只剩下一种可能性,你需要尝试TerminateProcess().如果仍然没有设置退出代码,那么你需要将该机器推出第4层窗口.

但期望它现在有效.ExitProcess()和TerminateProcess()之间的区别在于前者确保终止通知所有DLL.用fdwReason = DLL_PROCESS_DETACH调用它们的DllMain()函数.这让DLL有机会做一些像调用Exit/TerminateProcess()本身一样的东西,从而搞砸了退出代码.

如果您没有所有源代码,那么查找这样的DLL可能会很困难.也可能是一个注入的,这些天周围有太多.最好的办法是在系统调用上设置一个断点,这样你就可以在行为中捕获它,你可能想要这样做.

进入main()后,使用Debug> New Breakpoint> Break at Function并输入{,,ntdll.dll}_NtTerminateProcess@8.按F5,调试器现在在程序终止之前停止.查看调用堆栈以找到邪恶的行为者.