Это может быть очень простым вопросом, я, пытаюсь отладить приложение, которое генерирует следующую segfault ошибку в kern.log
kernel: myapp[15514]: segfault at 794ef0 ip 080513b sp 794ef0 error 6 in myapp[8048000+24000]
Вот мои вопросы:
Есть ли любая документация относительно того, что является различными кодами ошибки на segfault, в этом экземпляре это - ошибка 6, но я видел ошибку 4, 5
Каково значение информации at bf794ef0 ip 0805130b sp bf794ef0 and myapp[8048000+24000]
?
До сих пор я смог скомпилировать с символами, и когда я делаю a x 0x8048000+24000
это возвращает символ, который является корректным способом сделать его? Мои предположения к настоящему времени следующие:
Основываясь на моих ограниченных знаниях, ваши предположения верны.
SP
= указатель стека IP
= указатель инструкции MyApp [8048000 + 24000]
= адрес Если я отладки проблемы, я бы изменил код для производства Дамп сердечника или журнал A Backtrace в аварии. Вы также можете запустить программу (или прикрепить) GDB.
Код ошибки - это просто код ошибки архитектуры для неисправностей страницы и, похоже, является специфичной архитектурой. Они часто документируются в ARCH / * / MM / FILOS.C
в источнике ядра. Моя копия Linux / arch / i386 / mm / difl.c
имеет следующее определение для ERROR_CODE:
Моя копия Linux / arch / x86_64 / mm / dift.c
добавляет следующее :
Выполните addr2line -e myapp 080513b
(и повторите для других заданных значений указателя инструкций), чтобы увидеть, где происходит ошибка. Лучше получить сборку с отладкой и воспроизвести проблему в отладчике, таком как gdb.
В части libfoo.so [NNNNNN + YYYY]
, NNNNNN
- это место, где библиотека была загружена. Вычтите это из указателя инструкции ( ip
), и вы получите смещение в .so
неправильной инструкции. Затем вы можете использовать objdump -DCgl libfoo.so
и искать инструкцию по этому смещению. Вы легко сможете определить, какая это функция, по меткам asm. Если .so
не оптимизирован, вы также можете попробовать использовать addr2line -e libfoo.so
.
Вот разбивка полей:
адрес
- место в памяти, к которому код пытается получить доступ (вероятно, что 10
и 11
- это смещения от указателя, который, как мы ожидаем, будет установлен на допустимое значение, но который вместо этого указывает на 0
) ip
- указатель инструкции, т.е. где код, который пытается это сделать, живет sp
- указатель стека ошибка
- специфичные для архитектуры флаги; см. arch / * / mm / fault.c
для вашей платформы.