-
Notifications
You must be signed in to change notification settings - Fork 5
gdb посмертный анализ core файла
gdb посмертный анализ core-файла
Бывает также так, что просто по какой-то причине мы вообще не можем использовать никакой из отладчиков (например, между нами и целевой платой нет постоянной устойчивой и достаточно быстрой связи или вообще связи нет), или по какой-то причине под отладчиком программа работает без сбоев, а без отладчика падает. В этой ситуации нам может помочь core-файл (или core-dump). Это посмертный слепок с программы, в момент, когда она приводит к непоправимой ошибке, по нему можно узнать внутри какой функции и в какой строчке произошла ошибка, значения локальных переменных, проследить всю цепочку вызовов.
core-dump это фактически посмертный слепок с программы, полная информация о состоянии регистров, стека, глобальных переменных и т.д. на момент сбоя. Core-файл бинарный, и анализируется только отладчиком. Фактически, загружая core-dump в отладчик, мы затаскиваем его (отладчик) в состояние, в котором он оказался бы, если бы программа аварийно завершилась бы под управлением этого отладчика. Поэтому желательно запускать не кросс-отладчик на PC, а нативный $(TARGET)-gdb
для данной платформы и именно на данной платформе (иначе велика вероятность, что при загрузке он начнёт ругаться, что не может загрузить какие-нибудь shared-библиотеки и т.п. это, конечно, не страшно, дамп вы всё равно сможете проанализировать, но хочется, чтоб всё было lege artis).
Вы можете заметить, что core-файл у вас не генерируется сам, при отказе программы. Но при таком же отказе на PC, вы всегда получаете сообщение, что core dumped. Это настраивается при сборке ядра Linux, и также на генерацию файла "корки" влияет наличие свободного места на системной флешке. Для того, чтобы сохранять core-файл на внешнем носителе или по определенному пути, надо этот путь записать в /proc/sys/kernel/core_pattern
:
(1) echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern
%-символы описаны в man 5 core
(2) cat /proc/sys/kernel/core_pattern
(чтоб лишний раз убедиться, что новые параметры прописались)
после этого перед запуском своей программы дал команду
(3) ulimit -c unlimited
вот ссылка на ман по ulimit: http://ss64.com/bash/ulimit.html
этой командой в данном случае мы снимаем ограничения на размер core-файла
(4) запускаем нашу программу
(5) дожидаемся её падения
(6) проверяем, core-файл должен появиться.
(7) анализируем core-файл: gdb /путь/к/программе --core /tmp/core.1986
(8) тут полезны будут следующие команды (это мне посоветовали на linux.org.ru)
(gdb) backtrace full
(gdb) info registers
(gdb) x/16i $pc
(gdb) thread apply all backtrace