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


当前回答

我同意上面所有的答案。以下是我对BUS错误的2点看法:

总线错误不需要由程序代码中的指令引起。这可能发生在您正在运行二进制文件,并且在执行过程中,二进制文件被修改(被构建覆盖或删除等)。

验证是否属实

检查原因的一个简单方法是在构建输出目录中启动两个相同二进制文件的实例,并在它们启动后运行构建。在构建完成并替换二进制文件(两个实例当前正在运行的二进制文件)后不久,这两个正在运行的实例都会崩溃并报出一个SIGBUS错误。

根本原因

这是因为操作系统交换内存页,在某些情况下,二进制文件可能不完全加载在内存中。当操作系统试图从相同的二进制文件中获取下一页时,这些崩溃就会发生,但二进制文件自上次读取以来已经发生了变化。

其他回答

在POSIX系统上,当代码页由于某种原因无法换入时,还可以获得SIGBUS信号。

我试图释放一个不小心在堆栈上的字符串:

#include <stdlib.h>

int main(void)
{
    char *str = "foo";
    free(str);
    return (EXIT_SUCCESS);
}

我的修复是strdup()堆栈上的字符串:

#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *str = strdup("foo");
    free(str);
    return (EXIT_SUCCESS);
}

我相信内核会引发SIGBUS 当应用程序显示数据时 数据总线上的不对中。我认为 那是因为大多数[?现代编译器 对于大多数处理器,垫/对齐 为程序员提供的数据 以前的对准问题(至少) 减轻,因此一个人看不见 这些天SIGBUS太频繁(AFAIK)。

来自:这里

这取决于你的操作系统、CPU、编译器以及其他因素。

一般来说,这意味着CPU总线无法完成命令或发生冲突,但这可能意味着一系列事情,具体取决于正在运行的环境和代码。

它通常表示未对齐的访问。

试图访问物理上不存在的内存也会产生总线错误,但如果您使用的是带有MMU的处理器和没有bug的操作系统,则不会看到这个错误,因为您不会将任何不存在的内存映射到进程的地址空间。