程序崩溃后是否可以执行代码?

时间:2019-02-22 16:39:54

标签: c++ windows debugging windows-10

我希望能够在崩溃发生时从应用程序中转储信息。是否可以执行类似的操作,例如在程序崩溃时分配要调用的回调?回调将从应用程序中转储数据。转储的数据将是特定于应用程序的,可能在堆栈转储中,但格式更易于非程序员读取。

操作系统是Windows 10。

2 个答案:

答案 0 :(得分:2)

  

程序崩溃后是否可以执行代码?

通常,取决于操作系统,进程将在终止之前从OS接收信号。信号处理程序(如果已注册并且未屏蔽信号)有机会在终止过程之前执行代码。

终止后,该进程不存在,无法执行代码,并且不再可以访问其内存。

可以安全地在信号处理程序中使用的功能受到限制。 C ++标准保证了以下功能的安全性(如果我错过了某些功能,可能并不详尽):

_Exit
abort
forward
initializer_list functions
memcpy
memmove
move
move_if_noexcept
numeric_limits members
quick_exit
signal
type traits
plain lock-free atomic operations

请注意,该标准所保证的功能都不能输出。您的操作系统可能还允许其他功能,并且应具有列出这些功能的文档。 POSIX标准确保openwrite函数的安全性,这些函数可用于输出。


以上内容假设崩溃的源头不在程序之外(例如,用户请求从OS终止,或者您的进程访问无效的内存,而OS对此做出了反应)。如果崩溃的源头来自程序内部,特别是如果您或标准库调用了std::terminate,那么您可以注册一个std::terminate_handler,它不仅限于信号处理程序是。

答案 1 :(得分:0)

Windows程序的一种可能解决方案是使用MiniDumpWriteDump函数。本页介绍了Windows发生崩溃时编写小型转储的其他方法-https://docs.microsoft.com/en-us/windows/desktop/dxtecharts/crash-dump-analysis