当前位置:  开发笔记 > 运维 > 正文

什么是总线错误?

如何解决《什么是总线错误?》经验,为你挑选了5个好方法。

"总线错误"消息的含义是什么,它与段错误有什么不同?



1> bltxd..:

现在,在x86上很少出现总线错误,并且当您的处理器甚至无法尝试请求的内存访问时发生错误,通常是:

使用处理器指令,其地址不满足其对齐要求.

访问不属于您的进程的内存时会发生分段错误,它们非常常见,通常是以下结果:

使用指向已解除分配的内容的指针.

使用未初始化的虚假指针.

使用空指针.

溢出缓冲区.

PS:更确切地说,这不是操纵会导致问题的指针本身,而是访问它指向的内存(解除引用).


它们并不罕见; 我刚刚参加了练习9,从如何学习艰难的方式,已经遇到过一个......
总线错误的另一个原因(无论如何在Linux上)是操作系统无法使用物理内存支持虚拟页面(例如,低内存条件或使用大页面内存时的大页面.)通常mmap(和malloc)只是保留虚拟地址空间,内核根据需要分配物理内存(所谓的软页面错误.)制作足够大的malloc,然后写入足够的内容,你将得到一个总线错误.
在我的情况下,方法“ static_cast”为存储回调的对象添加了“ void *”参数(一个属性指向该对象,另一个属性指向该方法)。然后调用该回调。但是,作为“ void *”传递的内容完全不同,因此方法调用导致总线错误。

2> Clinton Pier..:

段错误是访问您不允许访问的内存.这是只读的,你没有权限等等......

总线错误正在尝试访问不可能存在的内存.您使用了对系统无意义的地址,或者该操作的错误地址类型.



3> Oli..:

我相信当应用程序在数据总线上出现数据错位时,内核会引发SIGBUS.我认为,由于大多数处理器的大多数[?]现代编译器为程序员填充/对齐数据,因此过去(至少)减少了对齐问题,因此现在人们看不到SIGBUS(AFAIK).

来自:这里



4> Ciro Santill..:

mmap 最小的POSIX 7示例

内核发送SIGBUS到进程时发生"总线错误" .

产生它的最小例子因为ftruncate被遗忘了:

#include  /* O_ constants */
#include  /* ftruncate */
#include  /* mmap */

int main() {
    int fd;
    int *map;
    int size = sizeof(int);
    char *name = "/a";

    shm_unlink(name);
    fd = shm_open(name, O_RDWR | O_CREAT, (mode_t)0600);
    /* THIS is the cause of the problem. */
    /*ftruncate(fd, size);*/
    map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    /* This is what generates the SIGBUS. */
    *map = 0;
}

运行:

gcc -std=c99 main.c -lrt
./a.out

在Ubuntu 14.04中测试过.

POSIX 描述 SIGBUS为:

访问内存对象的未定义部分.

该MMAP规范说:

从pa开始并且在对象结束之后继续len字节到整个页面的地址范围内的引用将导致SIGBUS信号的传递.

shm_open 说它生成大小为0的对象:

共享内存对象的大小为零.

所以*map = 0我们正在触及分配对象的末尾.



5> Joshua..:

当代码页由于某种原因无法被分页时,您也可以获得SIGBUS.


当我在运行进程时更新.so文件时,通常会发生这种情况
推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有