作者:曹彩节 | 来源:互联网 | 2023-05-24 01:19
我有一个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
),但这些都不似乎有什么影响.我也试图返回其他代码,也没有结果.
有一个类似的问题,但我无法重现其中描述的结果.我的程序确实使用线程.
我该如何处理调试此问题?我很困惑.
1> Hans Passant..:
我试图使用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,调试器现在在程序终止之前停止.查看调用堆栈以找到邪恶的行为者.