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

问题描述 投票:-1回答:2

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

操作系统是Windows 10。

c++ windows debugging windows-10
2个回答
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终止,或者您的进程访问无效内存,操作系统对此做出反应)。如果崩溃的来源是来自程序内部,特别是如果您或标准库调用std::terminate,那么您可以注册一个std::terminate_handler,它不像信号处理程序那样受限制。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.