【发布时间】:2015-08-11 06:31:45
【问题描述】:
对于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”错误。
-
请参阅 SDK 中的
ntstatus.h了解有关状态码的更多信息。按照惯例,干净地退出的进程返回 0、1 或 Win32 错误代码(它们都是小的正数),因此设置了最高位的退出代码通常意味着状态代码,通常是因为未处理的异常。特别是0xCnnnnnnn几乎总是一个状态码。 (但是,进程可以返回它喜欢的任何退出代码。)
标签: c++ windows crash exit-code