пятница, 21 января 2011 г.

Отладка реального бага в Лиспе

Если вы думаете, что самое сложное - это отловить рандомную порчу памяти в сишной программе для эмбеддед-платформы типа UCOS II, где сама программа и операционная система сидят в одном адресном пространстве без MMU, и никаких вам сегфолтов и валгриндов нет, то вы правы только отчасти.

Сижу сегодня, значит, клепаю "мета" на лиспе. Закончил очередной шаг, проверил, всё работает, закоммитил. Чудненько. Приступаю к следующему шагу, для которого нужна поддержка udp. В составе лиспворковского пакета comm поддержки udp нет, но есть внешняя лиспворксо-специфичная примочка lispworks-udp, которая мимикрирует comm, но с поддержкой udp. Добавляю, значит, :lispworks-udp в :depends-on моей системы, всё конпеляется ровно, но в вебе при попытке открыть один лисповый объект, которые у нас из dsl-описания автоматом генерятся, помимо всего прочего, в html с js, система ругается.

Первое предположение: случился тихой сапой какой-то клэшинг между нашими пакетами и этим lispworks-udp. Просмотрел внимательно, ничего не нашёл. Убрал депендс, давай вставлять (ql:quickload :lispworks-udp) в разные места. Нашёл, что если делать это после создания наших классов, то всё пучком. Давай делать бисект, т.е. отрезать из свежеподключенной системы файл за файлом, и ждать, пока перестанет глючить. Нашёл. Внимательно изучил бажный файл, ничего подозрительного нет. Так, объявляется пара-тройка обычных классов. Как девочка попробовал поменять имена классов, слотов, акцессоров и т.п - не помогло. Зато помогло комментирование кода. Уже интересно. Давай опять двигать ql:quickload, и обнаружил, что чем больше оттягиваю по времени подгрузку lispwork-udp, тем меньше надо комментить кода :) Причём, комментирование распространяется не только на тот файл.

Прикольно-то как! Показал начальнику, который веб-фреймворк с, прямо скажем, избытком "мета" ваял, он сразу сказал, что это виноват его фреймворк, где-то он, видимо, с метаобъектным протоколом не так работает. Но, позвольте, сказал я, а как же дикая свистопляска с комментированием и передвиганием места загрузки системы? Плюс сам лиспворкс пару раз стектрейс выплёвывал и даже тихой сапой в сегфолт валился. По-моему, это явный баг в компиляторе.

Дальше пошёл жуткий дебаг. Я, фактически, работал машинисткой, набирая команды под диктовку. MOP - штука страшная, особенно, когда доходит до багов, но начальник нереально крут в MOP. Он этот фреймворк лет 10 назад написал, и лет 5 не трогал, но всё равно сходу точно определял места, где смотреть. Причём, те места - голимый MOP. Крут мужик! И ещё я многое узнал про лиспворксоспецифичную отладку. Например, макрос trace гораздо более навороченный, чем про него в CLHS написано.

Рабочий день пролетел незаметно, больше толковой работы не сделали, сидели, ковырялись в потрохах. Пока нашли, что почему-то для одного класса не делается финализация, поэтому для его объектов не определены методы. Нашли, как минимум, два воркэраунда, но до самой сути проблемы пока не докопались (я домой в 8 вечера сбежал, пока на него по телефону орала жена ;). Начальник ставит на баг в его фреймворке, а я - на баг самого Лиспворкса. Ориентируюсь на то, что если косяк логический, то, во-первых, где сообщения об ошибках, которыми заботливый, но строгий компилятор ругает программера, а, во-вторых, откуда берутся стектрейсы и корки? Ошибки мы, правда, увидели при трассировке, но их где-то таинственным образом зажевало, и в консоли всё чистенько.

В общем, сложные системы тоже глючат, и глючат сложно.

Stay tuned.

6 комментариев:

  1. Интересно узнать продолжение этой эпопеи.

    ОтветитьУдалить
  2. Интересно, почню смотрел комикс, где лисп-инопланетяне прилетели спасать землян(c++, java) из под гнета багов, выходит врет комикс :)

    ОтветитьУдалить
  3. где жеж были энит тесты и континиус интегрэйшны.. ай-яй-яй, хакеры ;-)

    ОтветитьУдалить
  4. Много слов, смысла -- Ноль.

    ОтветитьУдалить
  5. Победил. Во фреймворке на MOP своя объектная система сделана, и defclass без (eval-when (:compile-toplevel :load-toplevel :execute) ...) был. А DSL'ная программа прямо в рантайме load'ом грузилась.

    ОтветитьУдалить

Архив блога