O que significa a mensagem "erro de barramento" e como ela difere de um segfault?
c
unix
segmentation-fault
bus-error
raldi
fonte
fonte
Respostas:
Atualmente, os erros de barramento são raros no x86 e ocorrem quando o seu processador não pode sequer tentar o acesso à memória solicitado, normalmente:
As falhas de segmentação ocorrem ao acessar a memória que não pertence ao seu processo, elas são muito comuns e geralmente são o resultado de:
PS: Para ser mais preciso, isso não está manipulando o ponteiro propriamente dito que causará problemas, ele está acessando a memória para a qual aponta (desreferenciação).
fonte
/var/cache
era simplesmente cheia askubuntu.com/a/915520/493379static_cast
ed umvoid *
parâmetro para um objeto que armazena um retorno de chamada (um atributo aponta para o objeto e o outro para o método). Em seguida, o retorno de chamada é chamado. No entanto, o que foi passado comovoid *
algo completamente diferente e, portanto, a chamada do método causou o erro do barramento.Um segfault está acessando a memória que você não tem permissão para acessar. É somente leitura, você não tem permissão, etc ...
Um erro de barramento está tentando acessar a memória que não pode estar lá. Você usou um endereço que não faz sentido para o sistema ou o tipo errado de endereço para essa operação.
fonte
mmap
exemplo mínimo de POSIX 7"Erro de barramento" acontece quando o kernel envia
SIGBUS
para um processo.Um exemplo mínimo que o produz porque
ftruncate
foi esquecido:Correr com:
Testado no Ubuntu 14.04.
O POSIX descreve
SIGBUS
como:A especificação mmap diz que:
E
shm_open
diz que gera objetos de tamanho 0:Então,
*map = 0
estamos passando do final do objeto alocado.Acessos de memória de pilha não alinhados no ARMv8 aarch64
Isso foi mencionado em: O que é um erro de barramento? para SPARC, mas aqui vou fornecer um exemplo mais reproduzível.
Tudo o que você precisa é de um programa independente aarch64:
Esse programa gera o SIGBUS no Ubuntu 18.04 aarch64, Linux kernel 4.15.0 em uma máquina servidor ThunderX2 .
Infelizmente, não consigo reproduzi-lo no modo de usuário QEMU v4.0.0, não sei por que.
A falha parece ser opcional e controlada pelos campos
SCTLR_ELx.SA
eSCTLR_EL1.SA0
, resumi os documentos relacionados um pouco mais aqui .fonte
De: Aqui
fonte
Você também pode obter o SIGBUS quando uma página de código não puder ser acessada por algum motivo.
fonte
mmap
um arquivo maior do que o tamanho de/dev/shm
Um exemplo específico de erro de barramento que acabei de encontrar ao programar C no OS X:
Caso você não se lembre, os documentos
strcat
anexam o segundo argumento ao primeiro, alterando o primeiro argumento (vire os argumentos e funcionará bem). No Linux, isso causa uma falha de segmentação (como esperado), mas no OS X, ocorre um erro no barramento. Por quê? Eu realmente não sei.fonte
"foo"
é armazenado em um segmento de memória somente leitura, portanto, é impossível gravar nele. Não seria uma proteção contra sobrecarga de pilha, apenas proteção contra gravação na memória (isso é uma falha de segurança se o seu programa puder se reescrever).Uma instância clássica de um erro de barramento é em certas arquiteturas, como o SPARC (pelo menos alguns SPARCs, talvez isso tenha sido alterado), é quando você faz um acesso desalinhado. Por exemplo:
Esse trecho tenta gravar o valor inteiro de 32 bits
0xdeadf00d
em um endereço que (provavelmente) não está alinhado corretamente e gera um erro de barramento em arquiteturas que são "exigentes" nesse sentido. A Intel x86 é, por sinal, não como uma arquitetura, que permitiria o acesso (embora executá-lo mais lentamente).fonte
Depende do seu sistema operacional, CPU, compilador e possivelmente de outros fatores.
Em geral, isso significa que o barramento da CPU não pôde concluir um comando ou sofreu um conflito, mas isso pode significar uma variedade de coisas, dependendo do ambiente e do código que está sendo executado.
-Adão
fonte
Normalmente significa um acesso não alinhado.
Uma tentativa de acessar a memória que não está fisicamente presente também causaria um erro de barramento, mas você não verá isso se estiver usando um processador com uma MMU e um sistema operacional que não esteja com erros, porque você não terá nenhum memória existente mapeada para o espaço de endereço do seu processo.
fonte
scanf
). Isso significa que o OS X Mavericks está com bugs? Qual teria sido o comportamento em um sistema operacional sem bugs?Eu estava recebendo um erro de barramento quando o diretório raiz estava em 100%.
fonte
Meu motivo para erro de barramento no Mac OS X foi que eu tentei alocar cerca de 1Mb na pilha. Isso funcionou bem em um thread, mas, ao usar o openMP, isso gera erro de barramento, porque o Mac OS X tem um tamanho de pilha muito limitado para threads não principais .
fonte
Eu concordo com todas as respostas acima. Aqui estão meus 2 centavos em relação ao erro BUS:
Um erro de BUS não precisa surgir das instruções contidas no código do programa. Isso pode acontecer quando você está executando um binário e, durante a execução, o binário é modificado (substituído por uma compilação ou excluído etc.).
Verificando se este é o caso: Uma maneira simples de verificar se essa é a causa é iniciando instâncias em execução do mesmo binário e executando uma construção. Ambas as instâncias em execução travam com um
SIGBUS
erro logo após a conclusão da compilação e substituem o binário (aquele que ambas as instâncias estão executando no momento)Razão subjacente: isso ocorre porque o sistema operacional troca as páginas de memória e, em alguns casos, o binário pode não estar totalmente carregado na memória e essas falhas ocorrem quando o sistema operacional tenta buscar a próxima página do mesmo binário, mas o binário mudou desde a última vez Leia-o.
fonte
Para adicionar o que o blxtd respondeu acima, erros de barramento também ocorrem quando seu processo não pode tentar acessar a memória de uma 'variável' específica .
Percebeu o uso ' inadvertido ' da variável 'i' no primeiro 'loop for'? É isso que está causando o erro de barramento neste caso.
fonte
Acabei de descobrir da maneira mais difícil que, em um processador ARMv7, você pode escrever um código que gera uma falha de segmentação quando não otimizado, mas gera um erro de barramento quando compilado com -O2 (otimize mais).
Eu estou usando o compilador cruzado GCC ARM gnueabihf do Ubuntu 64 bits.
fonte
Um estouro de buffer típico que resulta em erro de barramento é,
Aqui, se o tamanho da string entre aspas duplas ("") for maior que o tamanho do buf, ocorrerá um erro de barramento.
fonte