Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, 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 нужно поставить зануление указателя, вспомнить, что вектор инвалидирует все указатели при добавлении новых элементов, перевести все контейнеры в режим отладки так, чтобы они следили за доступом за пределы выделенной памяти... К сожалению, других способов нет. |