ошибка сегментации в cppunit во время очистки

CPPUNIT аварийно завершает работу после выполнения моей программы при возврате из main на этапе очистки. dtor TestWrapping вызывает dtor TestSuite, который затем вызывает deleteContents, который запускает очистку тестовых случаев.

Что странно, так это то, что dtor TestSuite вызывается дважды? Это следует за успешным выполнением 6 тестовых случаев. Любая идея о том, как этого можно избежать?

    Program terminated with signal 11, Segmentation fault.
#0  0x0000000000000045 in ?? ()
(gdb) bt
#0  0x0000000000000045 in ?? ()
#1  0x0000000000000001 in ?? ()
#2  0x0000000001004f2d in CppUnit::TestSuite::~TestSuite (this=0x7fe7bc005820, __in_chrg=<optimized out>) at TestSuite.cpp:18
#3  0x0000000001004ebd in CppUnit::TestSuite::deleteContents (this=0x7fe7bc001040) at TestSuite.cpp:28
#4  0x000000000100500d in CppUnit::TestSuite::~TestSuite (this=0x7fe7bc005820, __in_chrg=<optimized out>) at TestSuite.cpp:18
#5  0x0000000001004c50 in CppUnit::TestRunner::WrappingSuite::~WrappingSuite (this=0x7fe7bc005820, __in_chrg=<optimized out>) at ../../include/cppunit/TestRunner.h:101
#6  0x000000000040b72a in main (argc=0, argv=0x7fff8198bf08) at /project/EAB3_EMC/BRF/lmcgupe/brf/build/../software/brfc_test/BrfcTestMain.cc:447


Code exercising this:
(from main)
    CppUnit::TextUi::TestRunner runner;
    CPPUNIT_NS::TestResult controller;
    CPPUNIT_NS::TestResultCollector result;
    controller.addListener( &result );

    // Show a message as each test starts
    //
    CppUnit::BriefTestProgressListener listener;
    runner.eventManager().addListener(&listener);
    controller.addListener( &listener );

    // Specify XML output and inform the runner of this format
    //
    std::ofstream xmlout("test_result.xml");
    CppUnit::XmlOutputter* outputter = new CppUnit::XmlOutputter(
            &result, xmlout);
    runner.setOutputter(outputter);


    CppUnit::TextOutputter consoleOutputter(&result , std::cout);

    runner.addTest(CreateAlarmBackupSuite::suite());
    runner.run( controller );

from class CreateAlarmBackupSuite: public CppUnit::TestFixture

    static CppUnit::Test *suite()
    {

        // Create the Test Suite
        //
        CppUnit::TestSuite *suite = new CppUnit::TestSuite("CreateAlarmBackupSuite");

        // Add the test cases

        //Crt_Syst_07
        suite->addTest(new CppUnit::TestCaller<CreateAlarmBackupSuite>(
                       "07_Crt_ScheduledBackup_ScheduledSingleEvent_SystemDataBackup_Non_Successful_Create_Persistent_ManualDelNotClear",
                &CreateAlarmBackupSuite::Crt_ScheduledBackup_ScheduledSingleEvent_SystemDataBackup_Non_Successful_Create_Persistent_ManualDelNotClear));



        //Crt_Syst_09
        suite->addTest(new CppUnit::TestCaller<CreateAlarmBackupSuite>(
                "09_Crt_ScheduledBackup_ScheduledSingleEvent_SystemDataBackup_Non_Successful_Create_Transient_NoRetry",
                &CreateAlarmBackupSuite::Crt_ScheduledBackup_ScheduledSingleEvent_SystemDataBackup_Non_Successful_Create_Transient_NoRetry));

return suite;
}

person user1964017    schedule 09.01.2013    source источник


Ответы (1)


Я надеюсь, что ваш код явно не вызывает деструкторы этих объектов, а либо вызывает delete для указателя на них, либо они выходят за пределы области видимости, и компилятор автоматически вызывает их деструкторы. Предполагая, что вы явно не вызываете деструкторы.....

Может показаться, что ваш объект TestSuite либо выполняет delete this, либо содержит указатель на себя (или каким-то образом получает указатель на себя в deleteContents()), а затем вызывает delete для этого указателя. Вы не опубликовали исходный код своего класса TestSuite (и, в частности, его метода deleteContents()), но это мое предположение, поскольку я не видел кода.

person phonetagger    schedule 09.01.2013
comment
Класс WrappingSuite обрабатывает удаление и очистку. Я явно не вызываю удаления. Я просто использую метод поваренной книги с веб-сайта cppunit, где статический метод строит тестовые случаи в набор, который затем передается в метод запуска addTest. - person user1964017; 09.01.2013
comment
Хорошо, тогда я предполагаю, что вы создаете свой TestSuite как локальный объект, а не используете new? Или что-то вдоль этих линий? - person phonetagger; 09.01.2013
comment
Я создаю его новым, заполняю его тестовыми примерами и передаю этот объект моему бегуну с помощью runner.addTest. После этого запускается тест и явно не удаляется на нем. Похоже, проблема внутри CppUnit. Он просто падает. - person user1964017; 09.01.2013
comment
@user1964017 user1964017 — Можете ли вы опубликовать урезанную версию собственного кода, вызывающего такое поведение? - person phonetagger; 10.01.2013
comment
После запуска valgrind в моей программе и устранения крупных утечек и недопустимых чтений, о которых сообщалось, проблема была решена. Симптомы, о которых сообщалось первоначально, скорее всего, были побочными эффектами утечек и недействительных считываний. О проблеме было сообщено в тестовой программе, которая не отслеживалась на наличие утечек так строго, как другие программы, что объясняет, почему она не попала в поле зрения. - person user1964017; 16.01.2013
comment
@ user1964017 - Спасибо за обновление! Поскольку никто не вложился в этот вопрос, и поскольку он вряд ли поможет будущим посетителям, не могли бы вы удалить вопрос? Спасибо! - person phonetagger; 16.01.2013