Ce qui est une erreur de bus?
Quoi le "bus de message d'erreur, et comment est-il différent d'une erreur de segmentation?
- Je voudrais ajouter une explication simple à la fois: erreur de Segmentation signifie que vous essayez d'accéder à la mémoire que vous n'êtes pas autorisé à (e. g. il ne fait pas partie de votre programme). Cependant, sur une erreur de bus, cela signifie généralement que vous essayez d'accéder à la mémoire qui n'existe pas (e. g. vous essayez d'accéder à une adresse à 12G, mais vous avez seulement 8G de mémoire) ou si vous dépassez la limite de mémoire utilisable.
Vous devez vous connecter pour publier un commentaire.
Des erreurs de Bus sont rares de nos jours sur x86 et se produire lorsque votre processeur ne peut pas même tenter de l'accès à la mémoire demandée, généralement:
La Segmentation des défauts se produisent lors de l'accès à la mémoire qui n'appartient pas à votre processus, ils sont très fréquentes et sont généralement le résultat de:
PS: Pour être plus précis, ce n'est pas de manipuler le pointeur lui-même qui va provoquer des problèmes, il accède à la mémoire des points de (déréférencement).
/var/cache
était tout simplement plein askubuntu.com/a/915520/493379static_cast
ed unvoid *
paramètre un objet qui stocke un rappel (l'un des points d'attribut de l'objet, et l'autre pour la méthode). Ensuite, la fonction de rappel est appelée. Cependant, ce qui a été transmis commevoid *
était quelque chose de complètement différent et donc l'appel de la méthode a causé l'erreur de bus.Une erreur de segmentation est l'accès de la mémoire que vous n'êtes pas autorisé à accéder. Elle est en lecture seule, vous n'avez pas la permission, etc...
Une erreur de bus est en train d'essayer d'accéder à la mémoire qui ne peut pas être là. Vous avez utilisé une adresse qui est vide de sens pour le système, ou le mauvais type de l'adresse de l'opération.
À partir de: Ici
mmap
minimale POSIX 7 exemple"Bus error" se produit lorsque le noyau envoie
SIGBUS
à un processus.Un exemple minimal qui le produit, car
ftruncate
a été oublié:Exécuter avec:
Testé sous Ubuntu 14.04.
POSIX décrit
SIGBUS
comme:La mmap spec dit que:
Et
shm_open
dit que il génère des objets de taille 0:Donc à
*map = 0
nous touchent-delà de la fin de l'objet alloué.Non alignés pile d'accès à la mémoire en ARMv8 aarch64
Cela a été mentionné à: Ce qui est une erreur de bus? pour SPARC, mais ici, je vais fournir un plus reproductible exemple.
Tous vous avez besoin est un autoportant aarch64 programme:
Ce programme soulève alors SIGBUS sur Ubuntu 18.04 aarch64, le noyau Linux 4.15.0 dans un ThunderX2 machine serveur.
Malheureusement, je ne peux pas le reproduire sur QEMU v4.0.0 utilisateur en mode, je ne sais pas pourquoi.
La faute semble être en option et contrôlée par le
SCTLR_ELx.SA
etSCTLR_EL1.SA0
champs, j'ai résumé la relative docs un peu plus loin ici.Vous pouvez également obtenir SIGBUS lorsque une page de code ne peut pas être contacté pour une raison quelconque.
mmap
un fichier de taille supérieure à la taille de/dev/shm
Un exemple classique d'une erreur de bus est sur certains architecures, comme le SPARC (au moins certains SPARCs, peut-être que cela a été changé), c'est quand vous faites un mal alignée accès. Par exemple:
Cet extrait essaie d'écrire l'entier de 32 bits valeur
0xdeadf00d
à une adresse qui est (probablement) pas aligné correctement, et va générer une erreur de bus sur des architectures qui sont "difficile" à cet égard. Le processeur Intel x86 est, par ailleurs, pas une telle architecture, il permettrait l'accès (quoique l'exécuter plus lentement).Cela dépend de votre système d'exploitation, PROCESSEUR, Compilateur, et peut-être d'autres facteurs.
En général, cela signifie que le bus de l'unité centrale n'a pas pu terminer une commande, ou qui ont souffert d'un conflit, mais cela pourrait signifier une variété de choses en fonction de l'environnement et le code en cours d'exécution.
-Adam
Cela signifie normalement une liste non-alignés accès.
Une tentative d'accès à la mémoire qui n'est pas physiquement présent donnerait aussi une erreur de bus, mais vous ne verrez pas cette option si vous utilisez un processeur avec une MMU et un OS qui n'est pas buggé, parce que vous n'aurez pas inexistante mappés en mémoire à votre espace d'adressage du processus.
scanf
). Est-ce à dire que OS X Mavericks est buggé? Quel aurait été le comportement sur un non-buggy OS?Un exemple d'une erreur de bus j'ai juste rencontré lors de la programmation C sous OS X:
Dans le cas où vous ne vous souvenez pas des docs
strcat
ajoute le deuxième argument de la première par la modification du premier argument(retourner les arguments et il fonctionne très bien). Sur linux, cela donne une erreur de segmentation(comme prévu), mais sur OS X, il donne une erreur de bus. Pourquoi? Je ne sais vraiment pas."foo"
est stocké dans un segment en lecture seule de la mémoire, de sorte qu'il est impossible d'écrire. Il ne serait pas de débordement de pile dans la protection, la juste mémoire de protection en écriture (c'est un trou de sécurité si votre programme peut réécrire lui-même).J'obtenais une erreur de bus lorsque le répertoire racine a été à 100%.
Ma raison pour erreur de bus sur Mac OS X a été que j'ai essayé d'allouer environ 1 mo sur la pile. Cela a bien fonctionné dans un thread, mais lors de l'utilisation d'openMP cela conduit à l'erreur de bus, parce que Mac OS X n'a que très peu la taille de la pile pour les non-threads principaux.
À ajouter à ce que blxtd répondu ci-dessus, les bus, les erreurs se produisent également lors de votre processus de ne peut pas tenter d'accéder à la mémoire d'une "variable".
Notez le 'par inadvertance " l'utilisation de variable 'i' dans le d'abord "pour la boucle'? C'est ce qui est à l'origine de l'erreur de bus dans ce cas.
Je viens de trouver la manière dure que sur un processeur ARMv7 vous pouvez écrire du code qui vous donne une erreur de segmentation lors de l'unoptimized, mais vous donne un bus d'erreur lors de la compilation avec -O2 (optimiser plus).
Je suis en utilisant gcc arm gnueabihf cross compilateur de ubuntu x64.
Je suis d'accord avec toutes les réponses ci-dessus. Voici mes 2 cents concernant l'erreur de BUS:
Une erreur de BUS n'a pas besoin d'surviennent dans les instructions dans le code du programme. Cela peut se produire lorsque vous exécutez un fichier binaire et pendant l'exécution, le binaire est modifié (remplacé par une construction ou supprimé, etc.).
Vérifier si c'est le cas:
Un moyen simple pour vérifier si c'est la cause, c'est par le lancement d'instances en cours d'exécution de la même binaire et d'exécuter une build. À la fois les instances en cours d'exécution crash avec un
SIGBUS
erreur, peu de temps après la construction est terminée et a remplacé le binaire (celui qui à la fois les instances sont actuellement en cours d'exécution)Raison Sous-Jacente:
C'est parce que les OS des swaps de pages de mémoire et, dans certains cas, les binaires, peut-on être dans la mémoire, et ces accidents pourraient se produire lorsque le système d'exploitation tente de récupérer la page suivante à partir de la même binaire, mais le binaire a changé depuis la dernière lecture.
Typique d'un dépassement de la mémoire tampon qui résultats dans l'erreur de Bus est,
Ici, si la taille de la chaîne de caractères entre guillemets doubles ("") est de plus de buf de taille, il donne erreur de bus.