LINUX.ORG.RU

Кому не лень - потестите баг Qt

 , ,


0

2

Или это уже у меня заскоки, хз. В общем вот main.cpp:

#include <QCoreApplication>
#include <QUuid>
#include <QThreadStorage>

class Foo
{
public:
    void bar()
    {
        QUuid::createUuid();
    }
};

Foo* test()
{
    QThreadStorage<Foo*> data;
    if (!data.hasLocalData())
    {
        data.setLocalData(new Foo());
    }
    return data.localData();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    for (int i = 0; i < 100; i++)
    {
        test()->bar();
    }

    return a.exec();
}

Падает с SIGSEGV на Quuid::createUuid():

0	__memcpy_sse2_unaligned	/usr/lib/libc.so.6		0x7f89dc26bbe0	
1	QIODevice::read(char*, long long)	/usr/lib/libQt5Core.so.5		0x7f89dcbf9570	
2	QUuid::createUuid()	/usr/lib/libQt5Core.so.5		0x7f89dcc9b602	
3	Foo::bar	main.cpp	10	0x40117b	
4	main	main.cpp	30	0x401126	
Сам по себе Quuid нормально работает, если не QThreadStorage.

Ловит SIGSEGV на g++ 4.8.2/Qt 5.1.1 @ x86_64 (Archlinux current). С Qt 4.8.5 - SIGSEGV на a.exec() (где-то в malloc'е) Припоминаю похожие приколы на Qt 4.6.x, тогда решил забить на QThreadStorage (да судя по всему, на него вообще навсегда надо забить, кривулина).

Собственно просьба к уважаемым аналитикам подтвердить/опровергнуть баг перед постом в багзиллу.

Перемещено mono из talks

★★★★★

сборка шлангом 3.3 - та же беда.

dib2 ★★★★★
() автор топика
(gdb) bt full
#0  0x00007ffff79254a4 in QIODevice::isOpen() const () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
No symbol table info available.
#1  0x00007ffff79c2579 in QUuid::createUuid() () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
No symbol table info available.
#2  0x0000000000400c39 in Foo::bar (this=0x607c60) at ../test-lor/main.cpp:10
No locals.
#3  0x0000000000400be3 in main (argc=1, argv=0x7fffffffe568) at ../test-lor/main.cpp:30
        i = 0
        a = <incomplete type>

Странно да, при том что запуск в самом QtCreator

Starting /home/krab/temp/build-test-lor-Desktop-Debug/test-lor...
/home/krab/temp/build-test-lor-Desktop-Debug/test-lor exited with code 0

Starting /home/krab/temp/build-test-lor-Desktop-Release/test-lor...
/home/krab/temp/build-test-lor-Desktop-Release/test-lor exited with code 0
bhfq ★★★★★
()
Ответ на: комментарий от bhfq

уже смотрел, ничего военного не увидел. причина в QThreadStorage, где-то он гадит в стек. valgrind молчит

о, в C++11 есть же штатный thread storage? надо будет затестить.

dib2 ★★★★★
() автор топика
Ответ на: комментарий от bhfq

у меня фолтит отовсюду, с вероятностью ~80%

dib2 ★★★★★
() автор топика

Может ты все-таки хотел

static QThreadStorage<Foo*> data;

?

Ты каждый раз создаешь новый объект и суешь ему новый Foo*.

Pavval ★★★★★
()
Последнее исправление: Pavval (всего исправлений: 1)
Ответ на: комментарий от Pavval

нет. даже если создать новый объект, он вытягивает thread-local данные.

более того

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    test()->bar();
    return a.exec();
}

тоже SIGSEGV на QUuid

dib2 ★★★★★
() автор топика
Ответ на: комментарий от Pavval

но таки если вынести data в global - работает как положено. Т.е. в деструкторе QThreadStorage все-таки что-то происходит.

Думаю надо добавить этот момент в документацию, об этом и репортну.

спасибо, вопрос решен

dib2 ★★★★★
() автор топика
Ответ на: комментарий от dib2

он вытягивает thread-local данные.

а это вообще скорее всего случайность на неперетертых данных.

dib2 ★★★★★
() автор топика

Помню, раньше за тех. вопросы в толксах штаны^W скор снимали.

Ttt ☆☆☆☆☆
()
Ответ на: комментарий от dib2

Думаю надо добавить этот момент в документацию, об этом и репортну.

А что тогда это:

Make sure that all threads using QThreadStorage have exited before deleting the QThreadStorage.

Dendy ★★★★★
()
Ответ на: комментарий от dib2

нет. даже если создать новый объект, он вытягивает thread-local данные.

Я очень удивлюсь, если у свежесозданного очередного экземпляра QThreadStorage<Foo*> data; будет выполняться data.hasLocalData().

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

проверь :) у меня вчера так и было (согласно отладчику)

dib2 ★★★★★
() автор топика
Ответ на: комментарий от Dendy

Make sure that all threads using QThreadStorage have exited before deleting the QThreadStorage.

ну как обычно - документацию не читай - багрепорты создавай :)
в описание деструктора я-таки не заглянул
thx

dib2 ★★★★★
() автор топика
Ответ на: комментарий от Pavval

только что прогнал еще раз - таки true.
/me пошел смотреть сырцы QThreadStorage

dib2 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.