Skip navigation.

Sign up | Lost password? | Help

проФорт

Форт и всё такое

Как отлаживать крэш SPF

, ,

Один полезный и казалось бы очевидный трюк который может здорово помочь при отладке падений самого 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, когда он по сырому дампу стека в чате сходу сказал слово. Магия :smile:

ЗЫ Слово WordByAddr существует только для отладочных целей и использовать его в штатной ситуации не стоит (большие накладные расходы).
ЗЫЫ Кстати формат символьной информации в ELF документирован и хорошо было бы иметь возможность включить его в бинарник в подобных случаях. В Windows символьная информация хранится в pdb файлах, а DiaSDK даёт интерфейсы только на чтение. Хотя некоторая информация о внутренностях всё-таки есть.

Добавление методов в hype3 класс пост-фактумДинамический scoping... и bac4th

Comments

ayc 1. December 2008, 01:08

SPF4 падает без дампа только в случае переполнения или исчерпания стека, когда стеком перезаписывается виндовый фрейм ловли исключений. Мы как-то раз в SPF-DEV это подробно обсуждали. Можно ловить, если ставить вокруг стеков защитные страницы с VirtualProtect, пример я тоже давал.

Это не для линукса, конечно :smile:, но и в линуксе что-нибудь подобное должно быть...

exs 21. December 2008, 22:31

SPF4 падает без дампа только в случае переполнения или исчерпания стека, когда стеком перезаписывается виндовый фрейм ловли исключений.


Ну не только. До недавнего времени неверные аргументы и AV в API функции могли вызвать тихий крэш (Рувим пофиксил).

Этот конкретный случай был из-за ошибки в линуксовом коде ядра (константы были разные в разных линуксах).

Защищённые страницы памяти в линуксе конечно есть.

Вообще идея правильная, и реализация присутствует, нет привычки использовать.

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies