Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Редкий крах программы.


Автор: OlegIT 1.9.2016, 14:13
Программа на Qt под Android очень редко вылетает, без видимых причин. Как определить в каком модуле, в какой строке произошёл крах? 

Автор: Alca 1.9.2016, 14:52
Возможно stack trace получить
https://gist.github.com/jvranish/4441299

Автор: OlegIT 2.9.2016, 08:19
Спасибо, попробую.

Автор: Alca 2.9.2016, 09:32
И всё это собирай в дебаге

Автор: OlegIT 7.9.2016, 08:57
Включил в проект файл stack_traces.c, собрал, запустил. Но забыл убрать из кода мейн в файле stack_traces, mingv собрала программу и не выдала даже предупреждения, что в программе два мейна, это я понял, когда программа упала на тестовой ошибке. Это что, баг компилятора или...?

Автор: Alca 7.9.2016, 10:39
хз, ты stack trace получил?

Автор: OlegIT 7.9.2016, 14:14
stack trace получил, несколько уровней, правда только в виндах, до андройда пока не добрался. Но там только адреса, сбойной команды и вызывающих функций, а как это всё в исходный код странслировать? 

Автор: Alca 7.9.2016, 15:38
Цитата

Но там только адреса, сбойной команды и вызывающих функций, а как это всё в исходный код странслировать? 

Надо, чтобы все было собрано в дебагe, чтоб была включена отладочная информация (символы), погугли какие там ключи нужны для сборки (т.е. Qt должна быть собрана с этими ключами или что-там еще)

Автор: OlegIT 8.9.2016, 13:11
Утилита addr2line как я понимаю преобразует адрес в номер строки или как то так, сейчас буду разбираться.

Автор: OlegIT 9.9.2016, 14:03
Скачал winaddr2line подправил код обращение к этой программе, в ней возникает ошибка, код 487 "Попытка обратиться к неверному адресу". В чём может быть проблема?

Автор: Alca 9.9.2016, 15:19
да в чем угодно. Скорее всего это в твоем коде косяк

Автор: OlegIT 9.9.2016, 16:11
Не думаю, что это в моей программе ошибка, работает stack_traces и ddr2line, моей программы тут уже нет, она уже лежит.
stack_traces.c выдаёт список адресов, проверял они правильные, запускаю winaddr2line с соответствующей строкой аргумента, на некоторые адреса выдаёт ошибку 487, на другие 126.

Автор: maint 9.9.2016, 16:26
сто пудов где то ошибка адресациию Полгода мучался и ругал матерным словом голливуд, пока не понял. 

Автор: OlegIT 9.9.2016, 16:37
Не могу пока понять этих ошибок, одна по адресации, другая по отсутствую модуля и все после прохождения функции SymFromAddr(...); в winaddr2line.

Автор: OlegIT 12.9.2016, 15:29
Разобрался с этим вопросом, всё просто оказалось. Уйму времени потратил на winaddr2line, а она работает. В комплекте mingw есть программа addr2line, которая прекрасно работает. Но эта программа работает с консолью и максимум что мне удалось это для каждого вызова сделать свой лог файл. А как получить выход программы addr2line в своей программе, из которой я её вызываю?

Автор: Alca 12.9.2016, 15:32
https://bitbucket.org/skynowa/xlib/src/19922476d3dc2d0492549642ff8a1b8fabc8d576/Include/xLib/Debug/Platform/Unix/StackTrace_unix.inl?at=master&fileviewer=file-view-default#StackTrace_unix.inl-123

Автор: OlegIT 12.9.2016, 15:43
Разобрался и с этим, запускать консольное приложение нужно не через system(...), а через QProcess и далее методы класса.

Автор: OlegIT 23.9.2016, 22:15
Добрался я до сборки под Android, нет файла execinfo.h. Как я понимаю возможно не будет и других файлов включённых в execinfo.h. Может что дополнительно установить нужно?
А ещё и библиотеки ldbghelp нет.

Автор: bsa 26.9.2016, 13:30
А нельзя разве из-под отладчика (пусть даже удаленного - "remote") запустить? При крахе программа упадет в отладчик и можно будет что-то исследовать. Но по моему опыту, очень часто подобные ошибки "повреждение памяти" может всплывать в вообще случайных местах, и отладчиком понять что происходит невозможно, только или valgrind (многое находит, но работает под linux), или аналитически путем поиска и устранения всех узких мест программы. Наиболее частое - выход за пределы массива и работа с массивом в освобожденной области памяти. Поэтому, после каждого delete/free нужно поставить зануление указателя, вспомнить, что вектор инвалидирует все указатели при добавлении новых элементов, перевести все контейнеры в режим отладки так, чтобы они следили за доступом за пределы выделенной памяти... К сожалению, других способов нет.

Автор: OlegIT 26.9.2016, 14:17
Цитата(bsa @  26.9.2016,  13:30 Найти цитируемый пост)
А нельзя разве из-под отладчика (пусть даже удаленного - "remote") запустить? При крахе программа упадет в отладчик и можно будет что-то исследовать.

Увы нельзя, падение происходит при автономной работе, на планшете и редко, так что пока лучше чем лог файл ни чего не вижу. У меня падений ни разу не было, хоть и работаю с программой много, но в основном под виндами.
Мне бы сейчас понять причину падения, деление на ноль, работа с памятью..., а потом локализацией займусь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)