2015-07-22 1 views
0

J'ai écrit une bibliothèque dynamique et des tests unitaires pour celle-ci. Récemment, j'ai vérifié la bibliothèque avec Valgrind pour des fuites de mémoire et après un polissage j'ai réussi à me débarrasser de chaque fuite. Mais après avoir exécuté les tests unitaires de boost, j'ai rencontré plusieurs erreurs étranges de boost et je ne peux pas trouver l'origine ...Les tests d'unité Boost échouent avec sigabrt

Voici le journal des erreurs de la console complète:

nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 
nddlgen-core-test: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = sdf::Element; typename boost::detail::sp_member_access<T>::type = sdf::Element*]: Assertion `px != 0' failed. 

Dans les résultats de les tests unitaires, il dit aussi pour chacune de ces erreurs ci-dessus quelque chose comme ce qui suit:

../src/base/Controller_Test.cpp(72): Exception: signal: SIGABRT (application abort requested) 
Last check point was here. 

la chose étrange est que chaque BOOST_CHECK_* sans exception passe sans problème, mais finalement un peu (! pas tous) les fonctions de test échoueraient de toute façon avec les erreurs mentionnées ci-dessus ...

Voici une partie de ma classe de test unitaire, j'ai marqué la ligne 72 ci-dessus d'un commentaire. Puisque l'erreur est toujours la même, j'ai coupé la classe de test pour contenir un exemple.

#define BOOST_TEST_DYN_LINK 
#define BOOST_TEST_MODULE ControllerTest 

#include <boost/test/included/unit_test.hpp> 
#include <boost/algorithm/string.hpp> 

#include <nddlgen/Controller.h> 

using namespace std; 
using namespace nddlgen; 
using namespace boost; 
using namespace boost::unit_test; 

struct UnitUnderTest 
{ 
    UnitUnderTest() 
    { 
     c = new Controller(&this->errorText); 
    } 

    ~UnitUnderTest() 
    { 
     boost::checked_delete(c); 
    } 

    Controller* c; 
    string errorText; 
}; 

string existingFile = "res/testmodel.sdf"; 
string corruptedFile = "res/corruptedmodel.sdf"; 

/** 
* ====================================================== 
* Tests for normal operation 
* ====================================================== 
*/ 
BOOST_AUTO_TEST_SUITE (ControllerTestNormalBehaviour) 

    /** 
    * Test if the output file names match the expected behavior. 
    */ 
    BOOST_AUTO_TEST_CASE (testGetOutputFileNames) 
    { 
     UnitUnderTest uut; 
     string actualModelOutputFileName; 
     string actualInitialStateOutputFileName; 

     // Should work since a file identifier has not been set yet 
     BOOST_CHECK_EQUAL(uut.c->setFileIdentifier(existingFile), true); 

     actualModelOutputFileName = uut.c->getModelsOutputFileName(); 
     actualInitialStateOutputFileName = uut.c->getInitialStateOutputFileName(); 

     BOOST_CHECK_EQUAL(actualModelOutputFileName, "testmodel-model.nddl"); 
     BOOST_CHECK_EQUAL(actualInitialStateOutputFileName, "testmodel-initial-state.nddl"); // This is line 72 
    } 

BOOST_AUTO_TEST_SUITE_END() 

Après cela, j'ai vérifié le programme de test unitaire compilé avec Valgrind et trouvé plusieurs fuites de mémoire ... Je ne sais pas si cela est pertinent, mais depuis ma bibliothèque est (selon Valgrind) mem-fuite -Free, je suppose qu'il doit être boost ...

Que puis-je faire pour résoudre le problème afin que mes tests unitaires fonctionneront sans ce genre d'erreurs? Ou est-ce que quelqu'un a un conseil pour moi sur la façon dont je pourrais déboguer cela de quelque façon que ce soit?

Répondre

1

L'erreur ne figure pas dans le code affiché.

Live On Coliru

vous ont déboguer vous-même.

Le problème semble être avec libéré ou pointeurs partagés non initialisés à sdf::Element. Vérifiez si vous utilisez des données statiques qui auraient pu être liées à la fois à l'exécutable et à la bibliothèque dynamique (elles sont peut-être définies dans les fichiers d'en-tête).

Voir si vous avez partagé des pointeurs aliasant d'autres pointeurs partagés. Voyez si vous avez utilisé shared_from_this (indirectement) à partir du constructeur de l'objet.

Sinon, il suffit d'éliminer les causes. Commentez tous les tests jusqu'à ce que l'erreur disparaisse. Supprimer les TU. Faire plus de choses TU-local. Etc. etc. jusqu'à ce que vous ayez un échantillon qui corresponde à une question SO et qui présente toujours le problème.

Probablement, vous identifierez la source du problème avant cela. Sinon, nous sommes toujours là pour vous aider (encore plus).


Voir aussi:

+0

Th merci de votre aide à l'avance. J'essaie toujours de savoir ce que ça pourrait être ... Le problème avec 'sdf :: Element', c'est que c'est une bibliothèque que j'utilise. Je n'ai aucun accès direct à quoi que ce soit ... Au moins, je suis sur la bonne voie. J'ai découvert, que tous les cas de test s'exécutent sans problèmes, si je supprime simplement le destructeur. Ceci est, bien sûr, pas désiré, mais le destructeur fonctionne sans problème sur un programme CLI normal en utilisant ma bibliothèque partagée ... Je vais maintenant approfondir le problème, peut-être que c'est un problème dans la bibliothèque ... – CharlyDelta

+0

J'ai accepté votre répondre, car cela me conduit dans la bonne direction pour résoudre le problème. C'était très dur et prend du temps cependant ... Merci beaucoup pour votre aide :) – CharlyDelta