LINUX.ORG.RU

Как найти в qt проекте утечку памяти ?

 , , , ,


0

2

С помощью DebugDiag получаю крэшдамп со стек трейсом падения. По стеку определил, что падает из-за нарушения указателя переменной. В коде используется что-то типа

QList<MyClass *> * mylist
В какой-то момент по адресу переменной mylist вместо нормального адреса в дебагере qt вижу что-то типа 0xcdcdcdcd. И прога падает при первом обращении после повреждения указателя к этой переменной. Как найти где рушится этот указатель в коде, а также можно ли после этого штатно проверить, что он кривой и не дать ей упасть при обращении ? Проект довольно большой и достался от другого прогера, который уволился) Само повреждение указателя случается не регулярно, а к примеру может через 5 минут, может через пару часов упасть.

Ответ на: комментарий от Marvel

Да, но вопрос откуда это посреди работы кода. Этот указатель на старте инициализируется и дальше после его наполнения только читается прогой для анализа. В какой-то момент на анализе он вот так 0xcdcdcdcd становится, как бы поймать где это происходит. Заметил, что если убирать qDebug по коду, то падает значительно реже.

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

Копай в сторону неинициализированной памяти. Вот пример кода, который выводит CDCDCDCD в MS Visual Studio

#include <iostream>
#include <memory>

struct A {
    int * p;
};

int main()
{
    auto * a = new A;
    std::cout << a->p << std::endl;
    return 0;
}
Marvel
()
Ответ на: комментарий от RazrFalcon

Согласен, что не нужен. Я QList * никогда сам не использовал. Но в этой проге через сигналы этот указатель посылается в кучу других классов для обработки. Видимо поэтому был выбран указатель на QList.

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

Также вопрос как правильно передавать QList без указателя в другой слот по значению или его адрес, если сделать без указателя объявление.

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

слот может добавлять в QList объекты

Странная архитектура, ну да ладно. У тебя косяк с временем жизни объектов. Это нужно устранять, чтобы QList жил дольше объекта, в котором находится слот. Как костыль можно использовать не сырой указатель, а std::shared_ptr.

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

А я правильно понимаю, что самое простое в этом чужом проекте убрать указатели в QList и сделать его просто объектом. Я так понимаю, где-то идет разрушение кучи, которое задевает QList, а так хотя бы он на стеке будет выделен.

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

А я правильно понимаю, что самое простое в этом чужом проекте убрать указатели в QList и сделать его просто объектом

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

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

Как костыль можно использовать не сырой указатель, а std::shared_ptr.

Тогда можно получить утечку памяти, только не как в названии темы, а настоящую

annulen ★★★★★
()
valgrind --tool=memcheck --leak-check=yes --track-origins=yes --leak-check=full --show-leak-kinds=all ./your_qt_app

либо

-fsanitize=address -fstack-protector-all -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=leak
для QMAKE_CFLAGS/QMAKE_CXXFLAGS/QMAKE_LFLAGS и запускай
LD_PRELOAD=/path/to/libasan.so ./your_qt_app

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

В смысле, не нужен? Откуда такая уверенность? Может, он невладеющий?

next_time ★★★★★
()

советую начать с cppcheck по проекту, потом valgrind, да

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

по этому поводу документации не доверяйте: там в списке QString, например, который в действительности implicit sharing не поддерживает, во всяком случае, в версии 4.6, на которой я проверял

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

нет, т.к.

Вообще-то доступ нужен, так как слот может добавлять в QList объекты.

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

Так в 4.6 и не заявлялась такая фича, это фишка 5-й кути.

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