|
|
|
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Программа на Qt под Android очень редко вылетает, без видимых причин. Как определить в каком модуле, в какой строке произошёл крах?
|
|||
|
||||
Alca |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
Возможно stack trace получить
https://gist.github.com/jvranish/4441299 Это сообщение отредактировал(а) Alca - 1.9.2016, 15:04 |
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Спасибо, попробую.
|
|||
|
||||
Alca |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
И всё это собирай в дебаге
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Включил в проект файл stack_traces.c, собрал, запустил. Но забыл убрать из кода мейн в файле stack_traces, mingv собрала программу и не выдала даже предупреждения, что в программе два мейна, это я понял, когда программа упала на тестовой ошибке. Это что, баг компилятора или...?
|
|||
|
||||
Alca |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
хз, ты stack trace получил?
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
stack trace получил, несколько уровней, правда только в виндах, до андройда пока не добрался. Но там только адреса, сбойной команды и вызывающих функций, а как это всё в исходный код странслировать?
|
|||
|
||||
Alca |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
Надо, чтобы все было собрано в дебагe, чтоб была включена отладочная информация (символы), погугли какие там ключи нужны для сборки (т.е. Qt должна быть собрана с этими ключами или что-там еще) Это сообщение отредактировал(а) Alca - 7.9.2016, 15:42 |
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Утилита addr2line как я понимаю преобразует адрес в номер строки или как то так, сейчас буду разбираться.
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Скачал winaddr2line подправил код обращение к этой программе, в ней возникает ошибка, код 487 "Попытка обратиться к неверному адресу". В чём может быть проблема?
|
|||
|
||||
Alca |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
да в чем угодно. Скорее всего это в твоем коде косяк
Это сообщение отредактировал(а) Alca - 9.9.2016, 15:20 |
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Не думаю, что это в моей программе ошибка, работает stack_traces и ddr2line, моей программы тут уже нет, она уже лежит.
stack_traces.c выдаёт список адресов, проверял они правильные, запускаю winaddr2line с соответствующей строкой аргумента, на некоторые адреса выдаёт ошибку 487, на другие 126. |
|||
|
||||
maint |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 77 Регистрация: 12.5.2008 Репутация: нет Всего: 2 |
сто пудов где то ошибка адресациию Полгода мучался и ругал матерным словом голливуд, пока не понял.
Это сообщение отредактировал(а) maint - 9.9.2016, 16:26 |
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Не могу пока понять этих ошибок, одна по адресации, другая по отсутствую модуля и все после прохождения функции SymFromAddr(...); в winaddr2line.
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Разобрался с этим вопросом, всё просто оказалось. Уйму времени потратил на winaddr2line, а она работает. В комплекте mingw есть программа addr2line, которая прекрасно работает. Но эта программа работает с консолью и максимум что мне удалось это для каждого вызова сделать свой лог файл. А как получить выход программы addr2line в своей программе, из которой я её вызываю?
|
|||
|
||||
Alca |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
||||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Разобрался и с этим, запускать консольное приложение нужно не через system(...), а через QProcess и далее методы класса.
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Добрался я до сборки под Android, нет файла execinfo.h. Как я понимаю возможно не будет и других файлов включённых в execinfo.h. Может что дополнительно установить нужно?
А ещё и библиотеки ldbghelp нет. Это сообщение отредактировал(а) OlegIT - 23.9.2016, 22:19 |
|||
|
||||
bsa |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
А нельзя разве из-под отладчика (пусть даже удаленного - "remote") запустить? При крахе программа упадет в отладчик и можно будет что-то исследовать. Но по моему опыту, очень часто подобные ошибки "повреждение памяти" может всплывать в вообще случайных местах, и отладчиком понять что происходит невозможно, только или valgrind (многое находит, но работает под linux), или аналитически путем поиска и устранения всех узких мест программы. Наиболее частое - выход за пределы массива и работа с массивом в освобожденной области памяти. Поэтому, после каждого delete/free нужно поставить зануление указателя, вспомнить, что вектор инвалидирует все указатели при добавлении новых элементов, перевести все контейнеры в режим отладки так, чтобы они следили за доступом за пределы выделенной памяти... К сожалению, других способов нет.
|
|||
|
||||
OlegIT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 683 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Увы нельзя, падение происходит при автономной работе, на планшете и редко, так что пока лучше чем лог файл ни чего не вижу. У меня падений ни разу не было, хоть и работаю с программой много, но в основном под виндами. Мне бы сейчас понять причину падения, деление на ноль, работа с памятью..., а потом локализацией займусь. Это сообщение отредактировал(а) OlegIT - 26.9.2016, 14:19 |
|||
|
||||
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |