You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二进制执行阶段运行时错误转码及浮点异常信息输出机制问询

嘿,这两个问题问到点子上了,咱们一个个掰扯清楚:

问题1:机器层面,二进制程序的运行时错误如何转换为错误码?

当你的二进制程序在CPU上跑的时候,要是触发了运行时异常(比如除零、非法内存访问、执行非法指令),整个流程是硬件+操作系统内核配合完成的:

  • 首先CPU会立刻暂停当前的指令执行流,触发硬件异常/中断——这是硬件给内核发的“求救信号”;
  • 内核接收到这个信号后,会先识别异常的具体类型:比如除零对应SIGFPE信号,非法指令对应SIGILL信号;
  • 如果你的程序没有提前注册自定义的信号处理函数,内核就会走默认逻辑:直接终止进程,然后把异常对应的信号编号编码成进程的退出状态;
  • 你之后在shell里用echo $?查到的退出码,就是内核编码后的结果——比如在Linux系统里,要是进程被信号N终止,退出码会是128 + N(比如SIGFPE是信号8,对应的退出码就是136)。

问题2:输入0时控制台输出“Floating point exception: 8”,机器执行二进制时这个信息是怎么打印的?

这个锅其实不是你的二进制程序背的,是操作系统内核+启动程序的shell配合完成的,一步步拆解:

  1. 当你的程序执行到除零的二进制指令时,CPU直接触发SIGFPE信号(编号8),内核瞬间捕获到这个异常;
  2. 因为你的程序没写处理这个信号的代码,内核会直接终止进程,同时把“进程被SIGFPE信号终止”这个信息存在进程的退出状态里;
  3. 你是在shell(比如bash、zsh)里启动的这个程序,shell作为父进程,会一直盯着子进程的状态变化;
  4. 当子进程被终止后,shell会读取内核返回的终止原因,然后把内置的对应提示文本——也就是你看到的“Floating point exception: 8”——打印到控制台。

说白了,你的程序在触发异常的瞬间就被CPU暂停、内核终止了,根本没机会自己执行打印指令,这个提示是shell帮你输出的。

内容的提问来源于stack exchange,提问作者user1718009

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:15:46