“总线错误”消息是什么意思,它与分段错误有什么不同?
当前回答
我同意上面所有的答案。以下是我对BUS错误的2点看法:
总线错误不需要由程序代码中的指令引起。这可能发生在您正在运行二进制文件,并且在执行过程中,二进制文件被修改(被构建覆盖或删除等)。
验证是否属实
检查原因的一个简单方法是在构建输出目录中启动两个相同二进制文件的实例,并在它们启动后运行构建。在构建完成并替换二进制文件(两个实例当前正在运行的二进制文件)后不久,这两个正在运行的实例都会崩溃并报出一个SIGBUS错误。
根本原因
这是因为操作系统交换内存页,在某些情况下,二进制文件可能不完全加载在内存中。当操作系统试图从相同的二进制文件中获取下一页时,这些崩溃就会发生,但二进制文件自上次读取以来已经发生了变化。
其他回答
总线错误的一个典型实例是在某些体系结构上,例如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:
希望这能对某人有所帮助
它通常表示未对齐的访问。
试图访问物理上不存在的内存也会产生总线错误,但如果您使用的是带有MMU的处理器和没有bug的操作系统,则不会看到这个错误,因为您不会将任何不存在的内存映射到进程的地址空间。
一个值得注意的原因是,如果您试图mmap用户空间不允许访问的/dev/mem区域,则会返回SIGBUS。
推荐文章
- 递归复制文件夹,不包括一些文件夹
- C多行宏:do/while(0) vs作用域块
- 如何使用文件的行作为命令的参数?
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- 运行ssh后立即执行命令
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- main()中的Return语句vs exit()
- 如果不是内存地址,C指针到底是什么?
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 保护可执行文件不受逆向工程的影响?
- 如何让命令行参数传递给unix/linux系统上正在运行的进程?
- 从C语言的函数返回一个struct