2009-05-08 18 views
34

¿Diferencia entre un error de bus y una falla de segmentación? ¿Puede ocurrir que un programa genere una falla seg y se detenga por primera vez y, por segunda vez, puede dar un error de bus y salir?Error de bus vs Error de segmentación

+0

Posible duplicado de [¿Qué es un error de bus?] (Http://stackoverflow.com/questions/212466/what-is-a-bus-error) –

Respuesta

39

En la mayoría de las arquitecturas que he usado, la distinción es que:

  • un SEGV es causada cuando se accede a la memoria que no está destinado a (por ejemplo, fuera de su espacio de direcciones).
  • a SIGBUS se debe a problemas de alineación con la CPU (p. Ej., Intentar leer un texto largo de una dirección que no es un múltiplo de 4).
+13

Los archivos de memoria mapeados también pueden generar SIGBUS. – bk1e

+0

en el brazo SIGBUS puede ocurrir si lee un flotador desde una dirección que no está alineada con 4 bytes – shoosh

+2

shoosh, estoy bastante seguro de que está cubierto por mi segundo punto. – paxdiablo

4

Supongo que estás hablando de las señales SIGSEGV y SIGBUS definidas por Posix.

SIGSEGV se produce cuando el programa hace referencia a una dirección no válida. SIGBUS es un error de hardware definido por la implementación. La acción predeterminada para estas dos señales es terminar el programa.

El programa puede detectar estas señales e incluso ignorarlas.

6

Por ejemplo, un error de bus puede ser causado cuando su programa intenta hacer algo que el bus de hardware no admite. En SPARCs, por ejemplo, intentar leer un valor de varios bytes (como int, 32 bits) desde una dirección impar generó un error de bus.

Las fallas de segmentación ocurren, por ejemplo, cuando se hace un acceso que infringe las reglas de segmentación, es decir, tratando de leer o escribir memoria que no le pertenece.

+0

qué significa cuando dices "memoria de lectura o escritura que usted no posee? " cuando realiza un malloc que ha asignado como decir 5 bytes de memoria. Si usted lee/escribe memoria que no le pertenece, no le da un fallo de Seg en C. – Thunderboltz

+0

Por el contrario, sobrescribir una memoria propiedad de algún otro objeto en el mismo espacio de direcciones genera un error de Segmentación. – Geek

+0

"Lo que posee" en el nivel del sistema operativo suele ser mucho más de lo que el tiempo de ejecución emerge (por ejemplo, a través de malloc) para usted. Por lo tanto, hay mucho espacio para acceder a la memoria que posee, pero aún no debe tener y hay mucho espacio de direcciones que puede leer, pero no escribe (la mayoría de las bibliotecas mapeadas), así como funciones específicas para proteger regiones de memoria (mprotect) . –

0

Esto sería un DUP de What is a bus error?, si no fuera por el

¿Puede ocurrir que un programa da un fallo seg y se detiene por primera vez, y por segunda vez fuere dar un error de autobús y salir?

parte de la pregunta. Debería poder responder esto usted mismo con la información que se encuentra aquí.


Locura: hacer lo mismo una y otra vez y esperar resultados diferentes.
- Albert Einstein


Por supuesto, teniendo la pregunta literalmente ...

#include <signal.h> 
#include <stdlib.h> 
#include <time.h> 
#include <unistd.h> 
int main() { 
    srand(time(NULL)); 
    if (rand() % 2) 
     kill(getpid(), SIGBUS); 
    else 
     kill(getpid(), SIGSEGV); 
    return 0; 
} 

Tada, un programa que puede salir con un error de segmentación en una carrera y salida con una error de bus en otra ejecución.

+2

+1 para la cita de Einstein y para equilibrar un -1 injustificado. – tokland

2

Interpretando su pregunta (posiblemente incorrectamente) con el significado "Estoy obteniendo un SIGSEGV o un SIGBUS intermitentemente, ¿por qué no es consistente?", Vale la pena señalar que hacer cosas dudosas con punteros no está garantizado por C o C++ estándares para resultar en un segfault; es solo un "comportamiento indefinido", que como profesor lo había dicho una vez significa que en su lugar puede hacer que los cocodrilos emerjan de las tablas del piso y se los coman.

Por lo que su situación podría ser que usted tiene dos errores, donde la primera que se produzca veces causas SIGSEGV, y la segunda (si esta falla no sucedió y el programa todavía está en funcionamiento) provoca una SIGBUS.

Te recomiendo que vayas con un depurador y busques cocodrilos.

16

SIGBUS también se iniciará si mmap() un archivo e intenta acceder a parte del búfer asignado que se extiende más allá del final del archivo, así como para condiciones de error como falta de espacio. Si registra un manejador de señal usando sigaction() y establece SA_SIGINFO, es posible que su programa examine la dirección de memoria con errores y maneje solo errores de archivos mapeados en la memoria.

Cuestiones relacionadas