Skip to content

gdb посмертный анализ core файла

Dmitry Ponyatov edited this page Aug 22, 2019 · 4 revisions

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
Clone this wiki locally