Russian Qt Forum

Qt => Общие вопросы => Тема начата: qtkoder777 от Август 26, 2015, 09:23



Название: Падает программа. Как понять где ошибка?
Отправлено: qtkoder777 от Август 26, 2015, 09:23
Падает программа при совершении некоторых действий, как нажатие на некоторые кнопки или удаление строки из таблицы. Причём раньше когда стоял только Qt 4.4.3 не падала, похоже что стала падать после установки Qt 4.8.5.
Отладчик открывает free.c, падение происходит при выходе из функции моей программы (на закрывающей скобочке).
Обычно если пишешь за пределы массива программа там же и падает, а здесь отладчик не даёт никакой информации.
Как найти ошибку?


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Пантер от Август 26, 2015, 09:25
Дебажить, увеличить логгирование, использовать valgrind.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: __Heaven__ от Август 26, 2015, 09:26
Обычно если пишешь за пределы массива программа там же и падает
Не всегда. Иногда просто идё порча соседних данных.
Самый быстрый способ - через valgrind.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qtkoder777 от Август 26, 2015, 09:39
Самый быстрый способ - через valgrind.

А он с Qt проектами работает?


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: __Heaven__ от Август 26, 2015, 09:39
Да


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qate от Август 26, 2015, 09:40
Самый быстрый способ - через valgrind.

это самый долгий )
столько мусору выдаст от самой qt - не найти свой баг


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Пантер от Август 26, 2015, 09:40
Но valgrind только под Linux.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Пантер от Август 26, 2015, 09:41
Самый быстрый способ - через valgrind.

это самый долгий )
столько мусору выдаст от самой qt - не найти свой баг

Если запускать из-под Креатора, Кьютового мусора будет мало, там фильтруется.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qtkoder777 от Август 26, 2015, 09:42
это самый долгий )
столько мусору выдаст от самой qt - не найти свой баг

А как тогда искать? Проект довольно большой, переписывать с нуля?


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: gil9red от Август 26, 2015, 09:51
это самый долгий )
столько мусору выдаст от самой qt - не найти свой баг

А как тогда искать? Проект довольно большой, переписывать с нуля?

Логируйте или запускайте под отладчиком


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qate от Август 26, 2015, 09:54
Если запускать из-под Креатора, Кьютового мусора будет мало, там фильтруется.

да, так меньше


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qtkoder777 от Август 26, 2015, 09:55
Логируйте или запускайте под отладчиком

А что логировать то? Отладчик не помогает.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: __Heaven__ от Август 26, 2015, 09:59
Под отладкой можно день - бесконечность просидеть. Быстрее поставить valgrind и прогнать в нём проект.
Даже если используется винда, поставить себе virtual box с линуксом на борту (например lubuntu) и накатить qtcreator с valgrind. Ещё ни раз пригодится.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qate от Август 26, 2015, 10:00
Отладчик не помогает.

если падает стабильно - считай что повезло, ищется элементарно - прям сам qtcreator и напишет где упал


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Igors от Август 26, 2015, 10:01
А что логировать то? Отладчик не помогает.
Вы далеко не в худшем положении из возможных, знаете место вылета и действия что к нему приводят. Всего этого могло и не быть - вот тогда нужно начинать длинную песню с логами.

Отладчик открывает free.c, падение происходит при выходе из функции моей программы (на закрывающей скобочке).
В первую очередь зайдите в эту скобочку - там обычно вызов деструкторов

если падает стабильно - считай что повезло,
То да


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: __Heaven__ от Август 26, 2015, 10:03
А что за массивы вы используете?


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Пантер от Август 26, 2015, 10:04
Локализуй примерное место сбоя, добавь туда вывод в лог всяких данных (текущие потоки, состояние переменных, указатели), постеенно сужай место поиска и найдешь то, что тебе нужно. Да, это может занять время, но что поделаешь. Я тут на работе 2 дня в удаленной отладке недавно провел, пока наконец не нашел место сбоя.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qtkoder777 от Август 31, 2015, 16:03
valgrind поставил, выводит кучу мусора, есть утечки памяти и ошибки "invalid read", похоже всё в Qt.
Но из-за утечек же падать не должно?
И под Linux не падает, только под Windows.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Пантер от Август 31, 2015, 16:30
Под виндой сборка под 32 бита?
Вывод валгринда прикрепи к сообщению, посмотрим, что у тебя там.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: qtkoder777 от Август 31, 2015, 16:54
Под виндой сборка под 32 бита?
Вывод валгринда прикрепи к сообщению, посмотрим, что у тебя там.
Сколько бит не знаю, падает не на всех компах. Под valgrind выполнил две операции, вызывающие падение, но под линукс не падает.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: __Heaven__ от Август 31, 2015, 16:57
У вас чтение за пределами массива
Цитировать
==6251== Invalid read of size 4


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Пантер от Август 31, 2015, 16:58
Завтра гляну.


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Пантер от Сентябрь 01, 2015, 08:04
Что-то у меня такое ощущение, что у тебя с моделями проблема. Могу ошибаться. Код можешь показать?


Название: Re: Падает программа. Как понять где ошибка?
Отправлено: Гурман от Сентябрь 01, 2015, 16:21
Падение на закрывающей скобке - испорчены данные в стеке. Сохранённый в стеке адрес изменён на недопустимый, и при обращении к нему происходит GPF. Дополнительная наводка:

У вас чтение за пределами массива
Цитировать
==6251== Invalid read of size 4

qtkoder777, ищите автоматический (находящийся в стеке) массив, в который что-то записывается - очевидно происходит запись за его границами, которая и портит стек.

Пакостность в том, что запись не туда может происходить не в самой функции, которая падает, а в вызванных из неё, неизвестно на каком уровне вложенности.