101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
1

Debug работает, Release валится

09.10.2017, 11:52. Показов 4896. Ответов 23
Метки нет (Все метки)

написал программку - RSS-фильтр
поскольку изначально была задумка получения информации о выходе новых альбомов любимых исполнителей, была добавлена функция поиска оных на компьютере, как раз на этой функции программа и валится

программа писалась под Qt 5.3 и работала прекрасно, позже добавил пару мелочей, а заодно и пересобрал под 5.7.1, после этого и появилась проблема

текст функции:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void EditWindow::searching(QString path)
{
 
    bool new_artist;
 
    // https://www.cyberforum.ru/qt/thread644532.html   -   там есть пример и без рекурсии, но так как-то понятнее
    QDir currentFolder(path);
 
    currentFolder.setFilter(QDir::Dirs | QDir::Files);
    currentFolder.setSorting(QDir::Name);
 
    QFileInfoList folderitems(currentFolder.entryInfoList());
 
    foreach (QFileInfo i_file, folderitems)
    {
        QString i_filename(i_file.fileName());
        if (i_filename == "." || i_filename == ".." || i_filename.isEmpty())
            continue;
 
        if (i_file.isDir())
            searching(path + "/" + i_filename);
        else
        {
            QString full_filename = path + "/" + i_filename;
 
            TagLib::FileRef ref(full_filename.toStdWString().c_str()); // только с таким преобразованием не игнорируются папки с нелатинскими буквами
            if (!ref.isNull() && ref.tag() != NULL)
            {
                QString data = QString("%1").arg(ref.tag()->artist().toCString(true));
                new_artist = true;
                for (int i = 0; i < artists.size(); i++)
                    if (data.trimmed() == artists.at(i).trimmed())
                        new_artist = false;
                if (new_artist && data != "") // на случай, если в поле "исполнитель" ничего нет
                    artists.push_back(data);
            }
        }
    }
}

при работе в дебаге программа может перелопачивать несколько минут терабайтный диск
при работе в релизе почти сразу зависает даже на тестовой папке с 2-3 исполнителями

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

попробовал первый вариант, добавил в .pro файл
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
# remove possible other optimization flags
QMAKE_CXXFLAGS_RELEASE -= -O3
QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O0

теперь релиз тоже работает с тестовой папкой, но если пытаться просканировать, скажем D:\ по-прежнему зависает

Добавлено через 14 минут
UPD: попробовал вместо очистки просто удалить папки дебаг и релиз, после этого при запуске релиза пишет
Не удалось запустить программу. Путь или права недопустимы?
если запустить сперва дебаг, потом релиз, то запускается, но результат такой же - релиз виснет
дебаг и релиз собираются в разные папки, разумеется
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2017, 11:52
Ответы с готовыми решениями:

Debug и release
Добрый день. проблема в следующем - в режиме Debug программа работает адекватно, в программе есть...

Разница release & debug
В чём собствено разница в версии релиза и дебага? Как бы теорию то знаю, но вот не понимаю чем в...

Создание проекта в QT Creator: Debug и Release
Кто знает, для чего в QTCreator при создании проекта возможность создать Debug и Release. Т.е. чем...

Внешний вид программы в Debug и Release версиях
Не могу понять, почему, когда запускаю свою программу в режиме Release, то все её внешние элементы...

23
487 / 365 / 94
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
09.10.2017, 12:12 2
Добавляем currentFolder.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::QDir::NoSymLinks);
Убираем закомменченое if (/*i_filename == "." || i_filename == ".." || */i_filename.isEmpty()) continue;

Если не поможет, добавляем отладочный вывод текущей папки и цикла. И, конечно же, делаем с O3.
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
09.10.2017, 15:15  [ТС] 3
сделал, теперь функция выглядит так:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
    QDir currentFolder(path);
 
    //currentFolder.setFilter(QDir::Dirs | QDir::Files);
    currentFolder.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::QDir::NoSymLinks);
    currentFolder.setSorting(QDir::Name);
 
    QFileInfoList folderitems(currentFolder.entryInfoList());
 
    foreach (QFileInfo i_file, folderitems)
    {
        QString i_filename(i_file.fileName());
        if (/*i_filename == "." || i_filename == ".." || */i_filename.isEmpty())
            continue;

а .pro файл так:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
# remove possible other optimization flags
#QMAKE_CXXFLAGS_RELEASE -= -O3
QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O0

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

добавил вывод текущего файла, стало интереснее - валится на одних и тех же файлах: wmv, bat, pdf, rar, log, png

решил добавлением проверки типа файла:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        else
        {
            QString full_filename = path + "/" + i_filename;
            step++;
            qDebug() <<  step << " - " << full_filename;
 
           [B] if (full_filename.contains("mp3", Qt::CaseInsensitive))[/B]
            {
                TagLib::FileRef ref(full_filename.toStdWString().c_str()); // только с таким преобразованием не игнорируются папки с нелатинскими буквами
                if (!ref.isNull() && ref.tag() != NULL)
                {
                    QString data = QString("%1").arg(ref.tag()->artist().toCString(true));
                    new_artist = true;
                    for (int i = 0; i < artists.size(); i++)
                        if (data.trimmed() == artists.at(i).trimmed())
                            new_artist = false;
                    if (new_artist && data != "") // на случай, если в поле "исполнитель" ничего нет
                        artists.push_back(data);
                }
            }
        }

интересно, что отладка нормально справляется и без этого
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
09.10.2017, 15:43 4
C++ (Qt)
1
TagLib::FileRef ref(full_filename.toStdWString().c_str());
C++ (Qt)
1
QString data = QString("%1").arg(ref.tag()->artist().toCString(true));
Думаю никто не знает что такое TagLib::FileRef.
А значит скорее ошибка где-то там...
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
09.10.2017, 15:46  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
Думаю никто не знает что такое TagLib::FileRef
функция разбора тегов данной библиотекой

да я думаю, что вопрос решён
на самом деле, зачем смотреть файлы кроме музыкальных? это ведь ещё и увеличивает время работы функции
так что разве в качестве праздного интереса
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
09.10.2017, 15:48 6
Выпилите это нафиг и проверьте, без этого..
Если будет работать значит- криво используете эту библиотеку.
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
09.10.2017, 16:01  [ТС] 7
Цитата Сообщение от Avazart Посмотреть сообщение
Выпилите это нафиг и проверьте, без этого если будет работать значит- криво используете эту библиотеку.
этого я сделать не могу, поскольку мне нужна работа именно этой функции
поскольку оно раньше работало, я думаю дело в том, что:

вот тут мной написано, что библиотека TagLib собрана с помощью:
компилятор - MinGW 4.9.1, Qt5.4.1

после этого я пересобирал сам проект
компилятор - MinGW 5.3.0, Qt5.7.1
а библиотеку использую старую

может если пересобрать её оно перестанет глючить, но я уже решил проблему более разумным способом
если будет не лень как-нибудь пересобрать библиотеку о результатах отпишусь
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
09.10.2017, 16:03 8
Цитата Сообщение от Fabeldyr Посмотреть сообщение
этого я сделать не могу,
Можете, что бы убедится в том месте где происходит ошибка.
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
09.10.2017, 16:44  [ТС] 9
решил проблему заменив
C++ (Qt)
1
QString data = QString("%1").arg(ref.tag()->artist().toCString(true));
на
C++ (Qt)
1
QString data = QString::fromStdString(ref.tag()->artist().toCString(true));
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
09.10.2017, 17:07 10
Откажитесь от использования си строк вовсе:

C++ (Qt)
1
QString data = QString::fromStdWString(ref.tag()->artist().toWString());
Добавлено через 6 минут
Кроме того если порыться в доке библиотеки то найдете специально объявленные макросы:

C++ (Qt)
1
2
#define     QStringToTString(s)   TagLib::String(s.utf8().data(), TagLib::String::UTF8)
#define     TStringToQString(s)   QString::fromUtf8(s.toCString(true))
http://taglib.org/api/classTag... 7d57e661b4
http://taglib.org/api/classTag... f4826d30ee
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
09.10.2017, 18:36  [ТС] 11
оказалось, что не решил
если использовать
C++ (Qt)
1
QString data = QString("%1").arg(ref.tag()->artist().toCString(true));
не работает релиз
если использовать
C++ (Qt)
1
QString data = QString::fromStdString(ref.tag()->artist().toCString(true));
и
C++ (Qt)
1
2
3
QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O0
как оказалось, не работает дебаг
если использовать
C++ (Qt)
1
QString data = QString::fromStdWString(ref.tag()->artist().toWString());
то даже не компилируется:
D:\qtprojects\dfrssfilter\editwindow.cpp:-1: ошибка: undefined reference to `_imp___ZNK6TagLib6String9toWStringB5cxx11Ev'
если использовать
C++ (Qt)
1
QString data = TStringToQString(ref.tag()->artist());
и
C++ (Qt)
1
2
3
QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O0
то дебаг работает, а релиз валится в момент добавления записей в БД, причём при следующем запуске эти исполнители уже есть в базе, т.е. обвал происходит после добавления
если же использовать
C++ (Qt)
1
QString data = TStringToQString(ref.tag()->artist());
и не использовать
C++ (Qt)
1
2
3
QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O0
то как и в первом случае - релиз зависает в момент обхода

продолжаю бубнотанцы с поиском примеров
или может скачать старый Qt и пересобрать под него, ведь работало же
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
09.10.2017, 18:48 12
Лучший ответ Сообщение было отмечено Fabeldyr как решение

Решение

Скачайте либу и пересобирите ее новым компилятором.
Кроме того вероятно вы неправильно что-то указываете линковщику.
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
11.10.2017, 16:02  [ТС] 13
скачал версию 1.11.1 (до этого была 1.10), пересобрал новым компилятором
и вижу теперь вот такое:
Кликните здесь для просмотра всего текста
Debug работает, Release валится

что-то я перестал понимать совсем

причём тут TagLib и
C++ (Qt)
1
 if (full_filename.contains(".mp3", Qt::CaseInsensitive))
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
11.10.2017, 16:18  [ТС] 14
а если вообще убрать проверку формата, то ошибка перемещается на строку
C++ (Qt)
1
 qDebug() <<  step << " - " << full_filename;
но это вообще бред

step - глобальная переменная, считает количество файлов
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
11.10.2017, 16:27 15
Цитата Сообщение от Fabeldyr Посмотреть сообщение
скачал версию 1.11.1 (до этого была 1.10), пересобрал новым компилятором
Ошибка, говорит мол не могу найти такую то ф-цию...
Т.е. вы:
1. Криво собрали либо вообще не собрали библиотеку
2. Или не указали библиотеки в pro файле в переменной LIBS, или сделали это не верно.
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
11.10.2017, 16:30  [ТС] 16
Цитата Сообщение от Avazart Посмотреть сообщение
либо не указали библиотеки в pro файле в переменной LIBS.
указал
Цитата Сообщение от Avazart Посмотреть сообщение
либо криво собрали либо вообще не собрали
вот тут возникло подозрение...
как я сам писал:
Цитата Сообщение от Fabeldyr Посмотреть сообщение
берём файлы libtag.dll, libtag.dll.a и папку taglib (из папки include) и копируем в папку с программой
а сейчас у меня появился только файл libtag.a
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
11.10.2017, 16:33 17
Цитата Сообщение от Fabeldyr Посмотреть сообщение
а сейчас у меня появился только файл libtag.a
Ошибка говорит про libtag.a (или libtag.lib) вот либо ее не указали в LIBS или libtag.a собрана не тем компилятором или еще что-то в таком духе.
0
101 / 15 / 2
Регистрация: 11.09.2014
Сообщений: 172
18.10.2017, 10:03  [ТС] 18
в общем, пересобрал TagLib 1.10 новым компилятором, проблема ликвидировалась

пробовал 1.11 и 1.11.1 (о чём писал ранее), но они уже требуют Boost, который тоже надо компилировать и там что-то за пределами моего понимания начинается, а просто без него как-то не собирается
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
18.10.2017, 13:31 19
А разве в Qt Multimedia нет ничего что выполняет поставленную задачу?
0
34 / 36 / 17
Регистрация: 16.04.2017
Сообщений: 478
Записей в блоге: 4
18.10.2017, 13:37 20
Цитата Сообщение от Avazart Посмотреть сообщение
А разве в Qt Multimedia нет ничего что выполняет поставленную задачу?
Есть. И в примерах есть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2017, 13:37

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Разное поведение при debug и release сборке
Здравствуйте! Писал клиент для сервера и вот с чем столкнулся: с слоте чтения данных пришедших с...

Разница в выводе графики между release и debug
Добрый день. Пример из книги М. Шлее. Qt версия 5.7. У всех так, или только у меня картинки разные...

Статическая сборка Qt / Расположение папки с Debug/Release файлом ПО
Только пришел в Qt. Создал в Qt Creator проект типа Qt Quick Controls 2 Application. Пустое окно с...

Не работает исполняемый файл в release
Всем добрый день. OC Ubuntu 14.04. QT creator. Запускаю файл в release через ctrl+r - программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.