1
280
现在x86上很少发生总线错误,当处理器甚至无法尝试请求的内存访问时,就会发生总线错误,通常:
访问不属于进程的内存时会出现分段错误。它们非常常见,通常是以下原因造成的:
PS:更准确地说,并不是操纵指针本身会导致问题。它正在访问它指向的内存(取消引用)。 |
2
94
segfault正在访问不允许访问的内存。它是只读的,你没有权限,等等。。。 总线错误试图访问不可能存在的内存。您使用了一个对系统没有意义的地址,或者该操作使用了错误的地址类型。 |
3
23
“总线错误”发生在内核发送
一个产生它的最小示例,因为
在Ubuntu 14.04中测试。
POSIX
describes
这个 mmap spec
和
ARMv8 aarch64中未对齐的堆栈内存访问 您只需要一个独立的aarch64程序:
不幸的是,我不能在QEMU v4.0.0用户模式下复制它,我不知道为什么。
该故障似乎是可选的,由控制
|
4
11
|
5
8
|
6
6
我同意上面所有的答案。这是我关于总线错误的2美分: 总线错误不必由程序代码中的指令引起。当您运行二进制文件时,在执行过程中,二进制文件会被修改(被生成或删除等覆盖),这可能会发生。
检查这是否是原因的一种简单方法是,从构建输出目录启动两个相同二进制格式的实例,并在它们启动后运行构建。这两个正在运行的实例都会崩溃
根本原因 这是因为操作系统交换内存页,在某些情况下,二进制文件可能不会完全加载到内存中。当操作系统试图从同一个二进制文件中获取下一页时,会发生这些崩溃,但该二进制文件自上次读取以来已发生更改。 |
7
5
总线错误的一个典型实例是在某些体系结构上,例如 SPARC
|
8
4
我在OS X上编程C时遇到的总线错误的一个具体示例:
|
9
3
当根目录为100%时,我收到一个总线错误。 |
10
2
尝试访问物理上不存在的内存也会导致总线错误,但如果使用的处理器带有MMU和没有bug的操作系统,则不会出现这种情况,因为不会有任何不存在的内存映射到进程的地址空间。 |
11
2
这取决于您的操作系统、CPU、编译器以及可能的其他因素。
|
12
1
我在MacOSX上出现总线错误的原因是我试图在堆栈上分配大约1Mb。这在一个线程中运行良好,但在使用openMP时,这会导致总线错误,因为Mac OS X的性能非常有限 stack size for non-main threads . |
13
1
首先,SIGBUS和SIGSEGV不是一种特定类型的错误,而是一组或一系列错误。这就是为什么您通常会看到一个信号编号(si_no)和一个信号代码(si_code)。
一般来说,我们可以这样说。 SIGBUS是指内存映射成功,并且您遇到底层内存系统问题(内存不足、该位置无内存、对齐、smmu阻止访问等),即总线错误。。 如果文件从系统中消失,SIGBUS也可以与mmap文件一起使用,例如,您将文件mmap到可移动介质上,然后将其拔出。 查看平台的一个好地方是siginfo.h头,以了解信号子类型。 e、 g.对于linux,本页提供了概述。 https://elixir.bootlin.com/linux/latest/source/include/uapi/asm-generic/siginfo.h#L245
最后一点需要注意的是,所有信号也可以由用户生成,例如kill。
|
14
0
我刚刚发现,在ARMv7处理器上,您可以编写一些代码,在未优化时会出现分段错误,但在使用-O2(优化更多)编译时会出现总线错误。 我使用的是来自Ubuntu 64位的GCC ARM gnueabihf交叉编译器。 |
15
0
对我来说,我无意中触发了一个“总线错误”,因为我没有声明我的程序集正在返回到
从数据返回代码时缺少文本指令:
希望这对某人有帮助 |
16
-1
导致总线错误的典型缓冲区溢出是,
|
17
-1
除了上面blxtd的回答之外,当您的进程 无法尝试访问特定“变量”的内存 .
注意 无意的 变量“i” 在 第一个“for循环”? |
CH_YUR · 为什么这段代码有分段错误? 2 年前 |
Okonjo Mitchel · CS50凯撒:分段故障问题 2 年前 |
Drin Kurtishi · cs50在线课程中凯撒问题集的问题 2 年前 |
DynamicApproach · 提取exec函数的参数 2 年前 |
Horcrux7 · 如何使用jffi/jnr处理SIGSEGV? 2 年前 |
J.Doe · 向函数传递双指针以获取C中的字符串 6 年前 |