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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序崩溃后是否可以执行代码?相关的知识,希望对你有一定的参考价值。

我希望能够在发生崩溃时从应用程序转储信息。有可能做一些事情,比如指定一个程序崩溃时调用的回调吗?回调将从应用程序转储数据。转储的数据可能是特定于应用程序的,可能位于堆栈转储中,但是非程序员可以更容易地阅读。

操作系统是Windows 10。

答案

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

通常,根据操作系统,该过程将在终止之前从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终止,或者您的进程访问无效内存,操作系统对此做出反应)。如果崩溃的来源是来自程序内部,特别是如果您或标准库调用std::terminate,那么您可以注册一个std::terminate_handler,它不像信号处理程序那样受限制。

另一答案

Windows程序的一种可能解决方案是使用MiniDumpWriteDump函数。此页面描述了在Windows中发生崩溃时编写minidump的不同替代方法 - https://docs.microsoft.com/en-us/windows/desktop/dxtecharts/crash-dump-analysis

以上是关于程序崩溃后是否可以执行代码?的主要内容,如果未能解决你的问题,请参考以下文章

Sleep() 方法后的代码片段没有被执行

是否可以动态编译和执行 C# 代码片段?

每当我运行我的片段时,这行代码 mapFragment.setRetainInstance(true);正在崩溃我的应用程序? [关闭]

片段中的Android按钮单击方法(崩溃)

Android - 应用程序启动时片段 onCreate 崩溃

google-map 片段应用程序在模拟器中崩溃后打开 WebView 活动