Question

J'écris une bibliothèque de programmation basée sur les événements à utiliser sur le BeagleBone Black et j'ai rencontré une erreur étrange.

Lorsque je compile exactement le même code avec exactement les mêmes indicateurs, je reçois les erreurs suivantes sur le processeur ARM, mais pas lorsque j'exécute le code compilé pour mon ordinateur x86.

$ ./missionControl
pure virtual method called
pure virtual method called
pure virtual method called
terminate called recursively
terminate called recursively
Aborted

Lorsque je compile et exécute sur mon ordinateur portable, le le programme fonctionne correctement.

C'est la commande que j'utilise pour compiler (ish, j'utilise un Makefile, mais les deux méthodes de compilation présentent exactement le même comportement) :

g++ -std=gnu++11 -pthread -O3 -D_GLIBCXX_USE_NANOSLEEP -o missionControl `find . -name *.cpp`

Peu importe que je compile de manière croisée avec Ubuntu arm-linux-gnueabi-g++ ou le compatible ARM g++ sur le BeagleBone actuel, j'obtiens toujours des erreurs sur ARM.

Ma question est la suivante :Quelle pourrait être la cause de cette erreur et que puis-je faire pour essayer de trouver la source ?Pourquoi cela se produirait-il sur une architecture de processeur, mais pas sur une autre, pour la même version de G++ ?

Merci!

Voici une trace du GDB du processeur ARM :

#0  0xb6d4adf8 in raise () from /lib/libc.so.6
#1  0xb6d4e870 in abort () from /lib/libc.so.6
#2  0xb6f50ab4 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6
#3  0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
#4  0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Était-ce utile?

La solution

Le problème s'est avéré être dû à un bug dans la version ARM de libstdc++ qui s'exécute sur BeagleBone.Un petit programme jouet qui n'a aucune fonction virtuelle provoque la même erreur ("fonction virtuelle pure appelée") lorsque std::thread est créé.

Je vais essayer de compiler une version personnalisée de gcc/libstdc++ 4.8 sur le BeagleBone lui-même – même si cela prend beaucoup de temps.

Autres conseils

Le méthode virtuelle pure appelée Une erreur se produit lorsque vous tentez d'utiliser la répartition dynamique pour appeler une fonction purement virtuelle dans une base avant que le type dérivé qui l'implémente n'ait été construit ou après qu'il ait déjà été détruit.

La cause la plus courante est que la classe de base tente d'appeler une fonction virtuelle pure à ce niveau via le constructeur ou le destructeur.En dehors de cela, comme cela a été souligné dans certains commentaires, si vous tentez d'accéder à un objet mort, vous pourriez également rencontrer le même problème.

Attachez simplement un débogueur au programme et voyez quelle fonction virtuelle est appelée et d'où.

Voir: https://groups.google.com/forum/#!topic/automatak-dnp3/Jisp_zGhd5I

Et: Pourquoi ce simple exemple de thread C++11 échoue-t-il lorsqu'il est compilé avec clang 3.2 ?

Maintenant, je n'ai aucune idée de pourquoi cela fonctionne, mais au moins pour moi.Ajoutez les quatre définitions de préprocesseur suivantes à la ligne de commande du compilateur :

__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8

Je n'ai pas expérimenté pour voir s'ils sont tous nécessaires ou si vous pouvez ou non vous en sortir avec seulement quelques-uns.Mais cela a résolu le problème pour moi.Merci à ceux qui ont écrit les réponses ci-dessus et merci à mon collègue de m'avoir surpassé sur Google :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top