LINUX.ORG.RU

Непонятный сегфолт

 ,


0

2

Имеется следующий код

..
qDebug() << QCoreApplication::applicationDirPath() + "/" + this->settings->value("sniffer_settings/local_save_dir").toString();
..

Строка конфига которая здесь используется

[sniffer_settings]
local_save_dir=sniffed

Если я делаю чистую сборку (т.е. сперва rm -rf * в директории сборки), то все выводится как надо и дальше выполняется код ниже. Если я запущу собранную программу второй раз, оно выведет все как надо и сегфолтнется, не выполняясь дальше. После чистой пересборки опять работает 1 раз. ЧЯДНТ?

★★★★

Проверяй указатели, которые разыменовываешь. 80%, что причина в них.

trex6 ★★★★★
()

На отладчик еще не накопил? Даже телепатам нужен трейс.

arturpub ★★
()

Совет - напихай побольше qDebug-ов в программе, разбей строку на много шагов, обильно сдобрив трейсами и нахождение ошибки лишь тупая механическая работа в этом случае.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от false

Qt такая штука что с ней, увы, иногда GDB может ничего не показать... Хотя в большинстве случаев GDB всё же однозначно указывает на место проблемы.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Qt такая штука что с ней, увы, иногда GDB может ничего не показать...

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

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

если закомментировать строку с qDebug()'ом, то все работает. Если путь, который я вывожу этим qDebug()'ом использовать например для инициализации объекта класса QDir, программа так же падает. Если выводить тоже самое как

printf("%s\n", QString(<тут_моя строка>).toStdString().c_str());
то тоже ничего не падает. В общем как только попытаться использовать эту строку где-нибудь, все сегфолтится.

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

Хз, информации мало.

Давай минимальный компилирующийся код, который вызывает сегфолт, и версию Qt.

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

в твоей программе битые указатели или аналогичная проблема с памятью. Ищи с помощью valgrind

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

ну вобщем то проблему нашел, крашится все на disconnect(), потому как дисконнектить нечего еще в тот момент. ну и дальше соответственно освобождение не выделенной памяти.

if(this->ftpClient){
        disconnect(this->ftpClient, SIGNAL(commandFinished(int,bool)), this, SLOT(slotFtpCommandFinished(int,bool)));
        delete this->ftpClient;
    }
а все потому что this->ftpClient не инициализирован. Но у меня под этот объект постоянно выделяется а затем освобождается память, поэтому придется делать как то так
delete this->ftpClient;
this->ftpClient = nullptr;

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

Апну. Как лучше инициализировать указатели, при условии что nullptr юзать нельзя? Просто сперва сделал так, а потом под виндой попробовал собраться (Qt 4.8.5 + MinGW 4.4), а там c++11 не поддерживается, более того, он ругается даже вот на это

QFile *processedFile = 0;

инициализировать их в конструкторе объекта?

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