总线错误与分段故障

Thu*_*ltz 37 c segmentation-fault bus-error sigbus

总线错误和分段错误之间的区别?是否会发生程序发出seg故障并第一次停止并且第二次发生总线错误并退出?

pax*_*blo 46

在我使用过的大多数架构中,区别在于:

  • 当您访问不想要的内存时(例如,在您的地址空间之外),会导致SEGV.
  • SIGBUS是由于与CPU的对齐问题引起的(例如,尝试从不是4的倍数的地址读取长整数).

  • 内存映射文件也可以生成SIGBUS. (16认同)
  • shoosh,我很确定我的第二个要点就是这个问题. (4认同)

bk1*_*k1e 21

SIGBUS如果你mmap()是一个文件并且尝试访问超出文件末尾的映射缓冲区的一部分,以及空间不足等错误条件,也会引发它.如果使用sigaction()和设置注册信号处理程序SA_SIGINFO,则可能让程序检查故障内存地址并仅处理内存映射文件错误.


unw*_*ind 6

例如,当程序尝试执行硬件总线不支持的操作时,可能会导致总线错误.例如,在SPARC上,尝试从奇数地址读取多字节值(例如int,32位)会产生总线错误.

例如,当您执行违反分段规则的访问时,即尝试读取或写入您不拥有的内存时,就会发生分段错误.

  • @Geek:操作系统无法知道“谁”在同一地址空间内进行写入。因此它不能保护您不覆盖同一程序中的内存。这就是大多数安全漏洞发挥作用的原因。 (3认同)

Sam*_*kes 6

将您的问题(可能是错误的)解释为“我间歇性地收到 SIGSEGV 或 SIGBUS,为什么它不一致?”,值得注意的是,C 或 C++ 标准并不能保证使用指针做一些狡猾的事情会导致段错误;这只是“未定义的行为”,作为一名教授,我曾经说过,这意味着它可能会导致鳄鱼从地板上出现并吃掉你。

因此,您的情况可能是有两个错误,第一个发生有时会导致 SIGSEGV,第二个(如果段错误没有发生并且程序仍在运行)会导致 SIGBUS。

我建议您使用调试器逐步执行,并留意鳄鱼。