“总线错误”消息是什么意思,它与分段错误有什么不同?


当前回答

一个值得注意的原因是,如果您试图mmap用户空间不允许访问的/dev/mem区域,则会返回SIGBUS。

其他回答

我在Mac OS X上出现总线错误的原因是我试图在堆栈上分配大约1Mb的内存。这在一个线程中工作得很好,但是当使用openMP时,这会驱动总线错误,因为Mac OS X对于非主线线程有非常有限的堆栈大小。

总线错误的一个典型实例是在某些体系结构上,例如SPARC(至少在某些SPARC上,可能已经更改了),即当您执行不一致的访问时。例如:

unsigned char data[6];
(unsigned int *) (data + 2) = 0xdeadf00d;

这段代码尝试将32位整型值0xdeadf00d写入(很可能)没有正确对齐的地址,并将在“挑剔”的体系结构上生成总线错误。顺便说一下,Intel x86并不是这样的架构。它将允许访问(尽管执行速度较慢)。

对于我来说,由于没有声明程序集返回到.text部分,我意外触发了“总线错误”。这似乎是显而易见的,但它让我困惑了一段时间。

Eg.

.globl _myGlobal # Allocate a 64-bit global with the value 2
.data
.align 3
_myGlobal:
.quad 2
.globl _main # Main function code
_main:
push %rbp

从数据返回代码时缺少一个文本指令:

_myGlobal:
.quad 2
.text # <- This
.globl _main
_main:

希望这能对某人有所帮助

一个值得注意的原因是,如果您试图mmap用户空间不允许访问的/dev/mem区域,则会返回SIGBUS。

一个我在OS X上编程时遇到的总线错误的具体例子:

#include <string.h>
#include <stdio.h>

int main(void)
{
    char buffer[120];
    fgets(buffer, sizeof buffer, stdin);
    strcat("foo", buffer);
    return 0;
}

如果你不记得,文档strcat通过改变第一个参数将第二个参数附加到第一个参数(翻转参数,它可以正常工作)。在linux上这给出了一个分割错误(正如预期的那样),但在OS X上它给出了一个总线错误。为什么?我真的不知道。