Как отлаживать крэш SPF
By exs. Saturday, 25. October 2008, 14:49:54
Один полезный и казалось бы очевидный трюк который может здорово помочь при отладке падений самого spf (без пойманного исключения и соответствующего стека возвратов).
Реальный пример - отлов бага #2035259.

В верхнем окне gdb (GNU debugger) препарирует упавший spf, в левом нижнем открыт исходный код на подозрении, в правом нижнем запущена рабочая версия spf.
Сам spf стек исключений не показывает - т.е. умирает очень нехорошим образом, а gdb показывает только адреса, т.к. никакой символьной отладочной информации нет. Но ведь мы можем сами сэмулировать работу spf когда он пишет стек исключения. Всё очень просто - магическое слово WordByAddr ( addr -- a u ) выполнит всю грязную работу и скажет определение какого слова накрывает заданный адрес. Более того, адреса слов ядра одинаковы для разных загруженных экземпляров одного и того же исполнимого модуля, поэтому можно просто копировать адреса из сессии gdb в рабочую версию spf и выполнять : q PARSE-NAME WordByAddr TYPE ;.
Раньше в таких случаях я в самом отладчике смотрел память вокруг адреса в поисках словарной статьи и узнавал имя слова. Этот способ я подсмотрел у ruvim'а в forth@c.j.r, когда он по сырому дампу стека в чате сходу сказал слово. Магия
ЗЫ Слово WordByAddr существует только для отладочных целей и использовать его в штатной ситуации не стоит (большие накладные расходы).
ЗЫЫ Кстати формат символьной информации в ELF документирован и хорошо было бы иметь возможность включить его в бинарник в подобных случаях. В Windows символьная информация хранится в pdb файлах, а DiaSDK даёт интерфейсы только на чтение. Хотя некоторая информация о внутренностях всё-таки есть.





ayc # 1. December 2008, 01:08
Это не для линукса, конечно
exs # 21. December 2008, 22:31
Ну не только. До недавнего времени неверные аргументы и AV в API функции могли вызвать тихий крэш (Рувим пофиксил).
Этот конкретный случай был из-за ошибки в линуксовом коде ядра (константы были разные в разных линуксах).
Защищённые страницы памяти в линуксе конечно есть.
Вообще идея правильная, и реализация присутствует, нет привычки использовать.