对于Windows中正常退出的进程来说,进程的退出码一般是以下的返回值:main
,或传递给的退出代码std::exit
. %ERRORLEVEL%
然后可以用于查询退出代码,并且可以用于确定程序是否正确执行,或者是否存在一些指示特定问题(特定于应用程序)的异常输入/失败。
但是,我对进程崩溃时的退出代码感兴趣。举一个非常简单的示例程序:
int main()
{
int * a = nullptr;
*a = 0xBAD;
return 0;
}
当我编译它并在 Windows 中运行时,我在命令行上得到:
MyCrashProgram.exe -> crashes
echo %ERRORLEVEL% -> -1073741819
退出代码始终是这个数字。这让我想到几个问题:
- 是退出代码
-1073741819
基于无效的写入崩溃,可以以某种方式预测吗?
- 如果是这样,是否有某种方法可以根据退出代码确定崩溃的类型?
- 这会随着所使用的编译器(我使用的是 MSVC 2012)而改变吗?
- 这会随着所使用的 Windows 版本(我使用的是 Win10 TP)而改变吗?
- 这会随着架构而改变吗(例如 x64 - 我使用 Win32)?
请注意,我对如何修改程序来捕获异常不感兴趣。我感兴趣的是对现有程序中可能发生的崩溃进行分类,我可能无法修改这些崩溃。
评论关于STATUS_ACCESS_VIOLATION
,引导我找到有关的文档GetExceptionCode https://msdn.microsoft.com/en-us/library/windows/desktop/ms679356(v=vs.85).aspx:
The return value identifies the type of exception. The following table identifies the exception codes that can occur due to common programming errors. These values are defined in WinBase.h and WinNT.h.
EXCEPTION_ACCESS_VIOLATION
映射到STATUS_ACCESS_VIOLATION
在下面的列表中。列表中所有带有前缀的异常STATUS
直接定义为前缀为的异常代码EXCEPTION
。按照文档RaiseException https://msdn.microsoft.com/en-us/library/windows/desktop/ms680552(v=vs.85).aspx,它解释了异常发生时尝试调试的过程,最后一步是:
If the process is not being debugged, or if the associated debugger does not handle the exception, the system provides default handling based on the exception type. For most exceptions, the default action is to call the ExitProcess function.
所以回答我的问题:
- 是的,退出代码是可预测的,它映射到
EXCEPTION_STATUS_VIOLATION
.
- 其他类型的错误将映射到其他常见异常代码。但是,通过使用任意异常代码(未处理)调用 RaiseException,进程的退出代码可以是任何内容
- 退出代码取决于 Windows SDK,而不是执行 Windows 版本或体系结构的编译器。尽管理论上这可能会随着较新的 Windows SDK 的出现而改变,但这对于向后兼容来说是不太可能的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)