#crash #signal #exception #minidump #breakpad #stack-overflow

crash-handler

允许在崩溃事件期间运行用户代码

11个版本

0.6.2 2024年6月8日
0.6.1 2024年1月29日
0.6.0 2023年4月3日
0.5.1 2022年11月17日
0.1.0 2022年4月29日

#49操作系统 分类中

Download history 3854/week @ 2024-05-04 4250/week @ 2024-05-11 5225/week @ 2024-05-18 3925/week @ 2024-05-25 4708/week @ 2024-06-01 6139/week @ 2024-06-08 6140/week @ 2024-06-15 5948/week @ 2024-06-22 7071/week @ 2024-06-29 7976/week @ 2024-07-06 6311/week @ 2024-07-13 10904/week @ 2024-07-20 7515/week @ 2024-07-27 7705/week @ 2024-08-03 7836/week @ 2024-08-10 6349/week @ 2024-08-17

31,129 每月下载量
用于 8 个crate(直接使用3个)

MIT/Apache

185KB
3K SLoC

🔥 崩溃-处理程序

当发生崩溃时运行用户指定的代码

Embark Embark Crates.io Docs dependency status Build status

Linux/Android

在Linux上,这是通过处理以下信号来完成的。

Linux信号处理的一个重要细节是,这个crate通过挂钩 signals 来处理 pthread_create,以便在每个线程上始终安装一个备用信号栈。 std::thread::Thread 已经这样做,但是通过挂钩 pthread_create 可以确保从例如C/C++代码创建的线程也能这样做。备用栈对于可靠地处理由 SIGSEGV 引起的 堆栈溢出 是必要的,因为否则信号会在引发信号的同一堆栈上处理。

SIGABRT

发送给进程的信号,告诉它中止,即终止。该信号通常由进程本身在调用 std::process::abortlibc::abort 时发起,但它可以像任何其他信号一样从进程外部发送。

SIGBUS

当进程引发 总线错误 时发送给进程的信号。

SIGFPE

当进程执行错误算术运算时发送给进程的信号。尽管它代表 floating point exception,但此信号还涵盖了整数运算。

SIGILL

当进程尝试执行非法、格式不正确、未知或受保护的指令时发送给进程的信号。

SIGSEGV

当进程进行无效的虚拟内存引用时,会发送信号到一个进程,例如,一个段错误。这包括臭名昭著的 null 指针访问、越界访问、使用后释放、栈溢出等。

SIGTRAP

当触发陷阱时,会发送信号到一个进程,例如,一个断点或调试断言。

Windows

在Windows中,我们捕获异常,这些异常涵盖了广泛的崩溃原因,以及无效参数纯调用

MacOS

在Macos上,我们使用异常端口。异常端口是异常过滤的第一层,从线程级别到进程(任务)级别,最后到主机级别。

如果没有注册用户端口,Macos的默认实现是将Mach异常转换为等效的Unix信号,并在执行异常/信号的默认操作(即进程终止)之前将其发送给任何注册的信号处理器。这意味着如果您在Macos上与信号处理结合使用此crate,您将不会得到预期的结果,因为此crate使用的异常端口将优先于信号处理器。请参阅此问题以获取具体示例。

注意,上述情况有一个例外,即SIGABRT由信号处理器处理,因为没有等效的Mach异常。

EXC_BAD_ACCESS

涵盖了与SIGSEGVSIGBUS类似的崩溃。

EXC_BAD_INSTRUCTION

涵盖了与SIGILL类似的崩溃。

EXC_ARITHMETIC

涵盖了与SIGFPE类似的崩溃。

EXC_BREAKPOINT

涵盖了与SIGTRAP类似的崩溃。

贡献

Contributor Covenant

我们欢迎社区为此项目做出贡献。

请阅读我们的贡献指南以了解更多关于如何开始的信息。在您做出任何贡献之前,也请阅读我们的贡献条款

任何有意提交以包含在Embark Studios项目中的贡献,都应遵守Rust标准许可模型(MIT OR Apache 2.0),因此将双重许可,如下所述,不附加任何额外条款或条件

许可

此贡献在以下两者下双重许可

任选其一。

为了明确,“您的”指的是Embark或任何其他贡献许可方/用户。

依赖

~0.4–5MB
~12K SLoC