我有一个 C++ Windows 程序无法设置退出代码。该程序非常复杂,我目前无法通过简单的测试用例重现该程序。我确实知道该程序调用exit(1)
因为我在那一行有一个断点。在我跨过它之后,调试器(VS2010)立即打印The program program.exe has exited with code 0 (0x0).
当我从外壳运行它时,%ERRORLEVEL%
也设置为0。
I use subsystem:console
和普通的旧main
(没有 WinMain)。
这只发生在 Windows Server 2008 R2 上,而不发生在我的 Windows 8.1 笔记本电脑上。我在两者上运行相同的可执行文件。
我尝试过使用exit
, _exit
, ExitProcess
, and return
(有问题的电话位于main
),但这些似乎都没有任何效果。我也尝试过返回其他代码,也没有结果。
有一个类似的问题 https://stackoverflow.com/questions/3294947/why-cant-i-test-the-return-code-in-windows-7但我无法重现其中描述的结果。我的程序确实使用了线程。
我该如何解决这个问题?我比较困惑。
我尝试过使用 exit、_exit、ExitProcess 和 return
您已经消除了所有合理的解释,尤其是 ExitProcess()。只剩下一种可能性,您需要尝试 TerminateProcess()。如果说still没有设置退出代码,那么您需要将该机器推出四楼的窗户。
但期望它现在有效。 ExitProcess() 和 TerminateProcess() 之间的区别在于,前者确保所有 DLL 都收到终止通知。他们的 DllMain() 函数通过 fdwReason = DLL_PROCESS_DETACH 来调用。这使得 DLL 有机会做一些令人讨厌的事情,比如调用 Exit/TerminateProcess() 本身,从而搞砸退出代码。
如果您没有所有源代码,找到这样的 DLL 可能会很困难。也可能是注射的,现在这样的情况太多了。最好的办法是在系统调用上设置一个断点,以便您可以实时捕获它,无论如何您可能都想这样做。
一旦进入 main(),使用 Debug > New Breakpoint > Break at Function 并输入{,,ntdll.dll}_NtTerminateProcess@8
。按 F5,调试器将在程序终止前停止。查看调用堆栈以找出作恶者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)