Russian Qt Forum

Qt => Общие вопросы => Тема начата: Fregloin от Август 16, 2012, 14:22



Название: Сегментация при повторной загрузке плагинов
Отправлено: Fregloin от Август 16, 2012, 14:22
Добрый день. Столкнулся с такой вот бедой.
В приложении нужно загружать/выгружать плагины. Сейчас плагины используются только в режиме редактора.
По умолчанию програ при запуске переходит в режим редактора. Плагины загружаются нормально, все работает.
Потом перехожу в режим исполнения, плагины выгружаются. Все нормально. Теперь нужно перейти опять в режим редактора, и при загрузке плагина прога валится в сегментацию.
Привожу код.

Код:
void    CArmEditor::loadPlugins()
{
#ifdef  Q_WS_WIN32
    QDir    pluginsDir(QDir::currentPath()+"/plugins");
#else
    QDir    pluginsDir(QDir::homePath()+"/plugins");
#endif
    QPluginLoader   *   loader;
    foreach(QString filename, pluginsDir.entryList(QDir::Files))
    {
        loader = new QPluginLoader;
        loader->setFileName(pluginsDir.absoluteFilePath(filename));

        if(!loader->load())
        {
            qDebug("%s",qPrintable(loader->errorString()));
            delete loader;
            continue;
        }
        else
        {
            qDebug("%s loaded",qPrintable(filename));
        }

        QObject * pluginObject = loader->instance(); //вот тут вылет при повтроной загрузке плагина
        if(!pluginObject)
        {
            loader->unload();
            delete loader;
            continue;
        }
        else
            fpluginLoaders.append(loader);

        CDockPluginInterface * dockPlugin = qobject_cast<CDockPluginInterface*>(pluginObject);
        if(dockPlugin)
        {
            fdockPlugins.append(dockPlugin);
        }
    }
}

void CArmEditor::unloadPlugins()
{
    /*
    foreach(CDockPluginInterface    *   plugin, fdockPlugins)
    {
        delete  plugin;
    }
    */
    foreach(QPluginLoader * loader, fpluginLoaders)
    {
        if(loader->unload())
            qDebug("%s unloaded",qPrintable(loader->fileName()));
        else
            qDebug("%s unload failed",qPrintable(loader->fileName()));
        delete loader;
    }
    fpluginLoaders.clear();
    fdockPlugins.clear();
}


Логика режима работы программы при смене с редактора на исполнение и назад удаляется/создается заново.
Есть пока три объека-логики:
Редактор и два исполнительных.
При переключении с редактора на исполнение, редактор удаляется (выгружаются плагины) и создается новый объект логики исполенения программы.
И наоборот, при переключении с исполенни в редактирование, удаляется исполнитель, создается редактор (грузятся плагины).
По умолчанию при старте программы создается редактор.


Название: Re: Сегментация при повторной загрузке плагинов
Отправлено: Fregloin от Август 16, 2012, 14:39
Так, нашёл причину вылета, но не могу понять как так получается.
У меня в папке с плагинами лежит две библиотчески, одна загружается нормально, другая не загружается (в первый раз!) изза undefined reference (тут еще нужно разбираться, что то не учел при сборке, ну да ладно, это сейчас не так важно).
Так вот, при первой загрузке некорретный плагин не грузится, о чем выдается соотвествующее предупреждение в консоль.
А вот при втором разе загрузке плагинов, некорректный плагин почему то грузится! (метод QPluginLoader::load()), и ошибок не выдает при загруке. Но при попытке поулчения корневого объекта их плагина вылетает сегментация... очень странно.