news 2026/5/12 21:38:21

稳定性(一):Crash

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
稳定性(一):Crash

程序奔溃

Java/Kotlin:

  • Java 和 Kotlin 代码都运行在 ART (Android Runtime) 上,当代码中抛出一个异常(如 NullPointerException)而没有被任何 try-catch 块捕获时,ART 会触发当前线程的异常分发机制,这个异常会沿着调用栈一路向上传递。如果最终抵达线程的顶部仍未被处理,ART 就会终止该线程。在终止前,ART 会调用一个可供开发者设置的回调接口——Thread.UncaughtExceptionHandler。

Native:

  • Native 崩溃发生在 C/C++ 代码层,它不受 ART 虚拟机管理。Native 崩溃的本质是 CPU 执行了非法指令,进而被操作系统内核检测到。内核会向对应的进程发送一个 Linux 信号 (Signal) 来通知这一事件,这是一种内核与进程之间进行异步通信的机制。
  • 异常发生时,CPU通过异常中断的方式,触发异常处理流程。不同的处理器,有不同的异常中断类型和中断处理方式。

信号机制

  • 信号的接收:接收信号的任务是由内核代理的,当内核接收到信号后,会将其放到对应进程的信号队列中,同时向进程发送一个中断,使其陷入内核态。注意,此时信号还只是在队列中,对进程来说暂时是不知道有信号到来的。
  • 信号的检测:进程陷入内核态后,有两种场景会对信号进行检测。当发现有新信号时,便会进入下一步,信号的处理。
    • 进程从内核态返回到用户态前进行信号检测
    • 进程在内核态中,从睡眠状态被唤醒的时候进行信号检测
  • 信号的处理
    • 信号处理函数是运行在用户态的,调用处理函数前,内核会将当前内核栈的内容备份拷贝到用户栈上,并且修改指令寄存器(eip)将其指向信号处理函数。
    • 接下来进程返回到用户态中,执行相应的信号处理函数。
    • 信号处理函数执行完成后,还需要返回内核态,检查是否还有其它信号未处理。如果所有信号都处理完成,就会将内核栈恢复(从用户栈的备份拷贝回来),同时恢复指令寄存器(eip)将其指向中断前的运行位置,最后回到用户态继续执行进程。

常见信号

  • SIGSEGV(11)
    • signal segmentation violation:段错误
    • 无效内存访问 访问无权访问的内存
    • 空指针 栈溢出 访问已释放对象的内存(Use-After-Free) 数组越界 试图写入只读内存段
  • SIGBUS(7)
    • Bus Error:总线错误
    • 非法内存访问
    • 访问 CPU 无法物理寻址的内存。通常是由于 CPU 的对齐问题引起的(例如,尝试从不是 4 的倍数的地址读取长整型数据)
  • SIGABRT(6)
    • 程序“主动”选择的崩溃,一般由调用 abort() 函数触发
    • 在 C/C++ 中,很多断言库(assert)在断言失败后会调用abort(),表明程序进入了一个绝对不应存在的状态。
    • 资源初始化异常(配置文件、对象) 虚拟内存不足
  • SIGILL
    • Illegal Instruction 非法指令
    • 当 CPU 的指令指针指向一个无效或包含损坏数据的地址时,CPU 无法识别将要执行的指令,便会触发此信号。
    • 函数指针错误导致跳转到非代码区、栈被破坏导致返回地址错误等。
  • SIGFPE(8)
    • Floating-Point Exception 浮点数异常
    • 整数除以零、浮点数上溢或下溢
  • SIGPIPE(13):管道破损,没有读端的管道写数据
  • SIGKILL(9):kill信号;不能被忽略、处理和阻塞
  • SIGTRAP(5):断点或陷阱指令
  • SIGSYS(31):系统调用异常;终止进程,核心转储
  • SIGSTKFLT(16):栈溢出
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 18:50:15

炉石传说自动化脚本新手入门:从零开始的全流程指南

炉石传说自动化脚本新手入门:从零开始的全流程指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-S…

作者头像 李华
网站建设 2026/5/11 4:02:52

第一章——办公自动化之Excel拆分工具:精准处理数据,提升办公效能

在办公场景中,我们常常会遇到大型的Excel文件,为了更方便地对数据进行管理和分析,有时需要根据特定条件将其拆分成多个小文件。例如,人力资源部门有一份包含全公司员工信息的Excel文件,为了便于各部门分别处理本部门员…

作者头像 李华
网站建设 2026/5/12 0:41:09

创客匠人峰会深度解析:知识变现的 “IP 资产化” 革命 —— 从 “运营流量” 到 “沉淀资产” 的长期增长逻辑

引言:峰会核心命题 ——AI 时代知识变现的终极形态是 “IP 资产化”2025 年 11 月 22 日 - 25 日,创客匠人主办的 “全球创始人 IPAI 万人高峰论坛” 在厦门海峡大剧院圆满落幕。这场汇聚 10000 余名全球创始人的盛会,以 “AI 重构生产力&…

作者头像 李华
网站建设 2026/5/9 0:22:54

LoRaWAN网络,如何提升现代建筑的智慧服务能力?

物联网时代革命下,万事万物都被赋予了感知与沟通的“生命力”,无论是拔地而起的摩天大厦,还是横跨江海的宏伟长桥,它们都可以通过配置物联网技术达成“物与物、物与人”之间的无缝交互,让管理者可以快速获取到这些建筑…

作者头像 李华
网站建设 2026/5/11 20:40:09

FTXUI动态布局:掌握ResizableSplit的5个实战技巧

FTXUI动态布局:掌握ResizableSplit的5个实战技巧 【免费下载链接】FTXUI :computer: C Functional Terminal User Interface. :heart: 项目地址: https://gitcode.com/gh_mirrors/ft/FTXUI 在现代终端应用开发中,灵活的用户界面布局是提升工作效率…

作者头像 李华
网站建设 2026/5/9 2:51:30

9、高效Shell脚本编写与模块化调试指南

高效Shell脚本编写与模块化调试指南 1. xargs命令的使用 xargs命令用于从标准输入构建并执行命令行。像cp、echo、rm、wc等命令,不会从标准输入或其他命令的重定向输出获取输入,这时可以使用xargs将其他命令的输出作为输入提供给这些命令。其语法如下: xargs [option]部…

作者头像 李华