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


当前回答

导致总线错误的典型缓冲区溢出是:

{
    char buf[255];
    sprintf(buf,"%s:%s\n", ifname, message);
}

在这里,如果双引号("")中的字符串的大小大于buf大小,则会给出总线错误。

其他回答

总线错误现在在x86上很少见,发生在你的处理器甚至不能尝试请求的内存访问时,通常是:

使用具有不满足其对齐要求的地址的处理器指令。

分段错误发生在访问不属于你的进程的内存时。它们非常常见,通常是以下原因造成的:

使用指向已释放对象的指针。 使用未初始化的伪指针。 使用空指针。 缓冲区溢出。

PS:更准确地说,不是操作指针本身会导致问题。它正在访问它所指向的内存(解引用)。

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

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

验证是否属实

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

根本原因

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

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

来自:这里

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

#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);
}

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

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