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?
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
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