2012-06-01 4 views
0

Я пытаюсь создать общую библиотеку (с CMake), которая использует объекты Qt (в частности QString и QQueue) внутри и используя эту библиотеку с другим приложением. Проблема заключается в том, что recieves применение SIGSEGV при вызове методов QQueue:Ошибка сегментации при использовании QQueue :: enqueue()

(gdb) r 
Starting program: /home/ilya/projects/qtLogger/build/qtLoggerSample 
[Thread debugging using libthread_db enabled] 
startup 
_DEBUG 
QtLogger::QtLogger() 
void QtLogger::foo(void*) 
void QtLogger::log(QtLogger::LOG_LEVEL, QString) lvl: DEBUGmsg: "debug 1" 

Program received signal SIGSEGV, Segmentation fault. 
0x08049450 in QString (this=0x2817ad9c, other=...) at /usr/include/qt4/QtCore/qstring.h:714 
714  inline QString::QString(const QString &other) : d(other.d) 
(gdb) bt 
#0 0x08049450 in QString (this=0x2817ad9c, other=...) at /usr/include/qt4/QtCore/qstring.h:714 
#1 0xb7fdda0c in QList<QString>::node_construct (this=0x804b474, n=0x2817ad9c, t=...) at /usr/include/qt4/QtCore/qlist.h:352 
#2 0xb7fdd7fa in QList<QString>::append (this=0x804b474, t=...) at /usr/include/qt4/QtCore/qlist.h:481 
#3 0xb7fdd5e0 in QQueue<QString>::enqueue (this=0x804b474, t=...) at /usr/include/qt4/QtCore/qqueue.h:59 
#4 0xb7fdd19f in QtLogger::log (this=0x804b460, level=QtLogger::LL_DEBUG, message=...) 
    at /home/ilya/projects/qtLogger/lib-qtLogger/src/libqtlogger.cpp:97 
#5 0x08049099 in main (argc=1, argv=0xbffff644) at /home/ilya/projects/qtLogger/src/main.cpp:27 

Исходный код приложения можно найти здесь: https://github.com/ilardm/qtLoggerSample/tree/137adee556f41eb4526e1d1c604e8541ef6eb65a

Исходный код библиотеки можно найти здесь (также доступен как мерзавца подмодуля хранилище приложений): https://github.com/ilardm/lib-qtLogger/tree/bf1b490fd7c6666176c23e6fd791c00937d954b4

Не могли бы вы помочь мне понять, где я ошибаюсь?

P.S. Я использую Qt 4.6.3, Debian Squeeze x86 и x64, gcc 4.4.5

+0

Если я ничего не пропустил, в любом из репозиториев, которые вы связали, нет 'QQueue' или' QList'. – HostileFork

+0

Примечание. Похоже, что ваша «ведущая» ветка не обновлена, ваш соответствующий код находится в «ядре». https://github.com/ilardm/lib-qtLogger/blob/core/inc/libqtlogger.h – HostileFork

+0

@ Хостинг Текущий текущий код находится в ядре филиала, но приложение repo использует правильную ревизию. просто для уточнения – ilardm

ответ

2

Вы развращаете свой QQueue своей инициализацией массива строк. Для тех, кто (как я), возникают проблемы навигации по Sources/Филиалы/SubRepositories ... Ваша декларация QtLogger выглядит следующим образом:

class LIBQTLOGGER_EXPORT QtLogger 
{ 
public: 
    typedef enum { 
     LL_EROR, 
     LL_WARNING, 
     LL_LOG, 
     LL_DEBUG, 

     LL_COUNT 
    } LOG_LEVEL; 

public: 
    QtLogger(); 
    ~QtLogger(); 

public: 
    void foo(void*); 

    void log(LOG_LEVEL, QString); 

protected: 
    LOG_LEVEL currentLevel; 
    QString ll_string[ LL_COUNT ]; 

    QQueue<QString> messageQueue; 
    QMutex mqMutex; 
}; 

И тогда ваш конструктор выглядит следующим образом:

QtLogger::QtLogger() 
    : currentLevel(LL_DEBUG) 
{ 
#if ENABLE_LOGGER_LOGGING 
    std::clog << __PRETTY_FUNCTION__ << std::endl; 
#endif 

    ll_string[ LL_EROR  ].sprintf("ERROR"); 
    ll_string[ LL_WARNING ].sprintf("WARN "); 
    ll_string[ LL_LOG  ].sprintf("LOG "); 
    ll_string[ LL_DEBUG  ].sprintf("DEBUG"); 

    ll_string[ LL_COUNT  ].sprintf("  "); 
} 

LL_EROR равно 0, LL_COUNT равно 4. (Sidenote: Это слово написано «ERROR», поэтому ваша строка является правильным битом.) В любом случае ... ваша декларация эффективно QString ll_string[4];, в которую вы помещаете 5 строк и развращаете последующие переменная члена.

Почему вы ставите эту пустую строку там, в первую очередь, для меня немного загадка ... (!) Но в любом случае векторные классы довольно легкие в схеме вещей, а не в сырых массивах, и часто обеспечивают дополнительную проверку границ для общих операций. Используйте QVector (или любой другой) в будущем и будет легче поймать этот класс ошибки:

http://qt-project.org/doc/qt-4.8/qvector.html

Короче говоря, это не имеет ничего общего с . В следующий раз попробуйте создать все в одном исполняемом файле, прежде чем считать, что это актуально! :-)

+0

Кроме того, это не имеет ничего общего с [tag: cmake]! Я собираюсь снять эти теги и дать этому более подходящий заголовок (для людей, которые могут приехать сюда через поиск Google в будущем ...) – HostileFork

+0

О, ши .. Вы правы. Спасибо. P.S. LL_EROR - это просто опечатка. Я полагаю, что я слишком устал и сон, когда писал этот код – ilardm

+1

+1 очень приятно поймать! @IlyaArefiev, если вы его примете, вы также должны его перенести: http://stackoverflow.com/faq#howtoask – Brady