使用 QQueue::enqueue() 时的分段错误



我正在尝试创建共享库(使用CMake),该库在内部使用Qt对象(特别是QString和QQueue),并将此库与其他应用程序一起使用。问题是应用程序在调用 QQueue 的方法时接收 SIGSEGV:

(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

库的源代码可以在这里找到(也可作为应用程序仓库的 git 子模块提供): https://github.com/ilardm/lib-qtLogger/tree/bf1b490fd7c6666176c23e6fd791c00937d954b4

你能帮我明白我错在哪里吗?

附言我正在使用Qt 4.6.3,Debian Squeeze x86和x64,gcc 4.4.5

你正在通过初始化字符串数组来破坏你的QQueue。 对于那些(像我一样)在导航源/分支/子存储库时遇到问题的人......你的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。 (旁注:该单词拼写为"ERROR",因此您的字符串是正确的位。 无论如何。。。您的声明实际上是QString ll_string[4];您在其中放置 5 个字符串并破坏后续成员变量。

为什么你一开始就把那根空绳子放在那里对我来说有点神秘......(!) 但无论哪种方式,向量类在事物方案中都非常轻巧,而不是原始数组,并且通常为常见操作提供更多的边界检查。 将来使用QVector(或其他什么),将更容易捕获此类错误:

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

简而言之,这与共享库无关。 下次,在假设相关之前,请尝试将所有内容构建到单个可执行文件中! :-)

相关内容

  • 没有找到相关文章

最新更新