26 декабря 2012 г.

Запись вебинара, декабрь 2012

Публикую запись вебинара со вторника: Обработка ошибок в Delphi (V2).

YouTube | Скачать для offline (MP4 + PDF)

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

  1. Спасибо вам большое. А запись предыдущего вебинара имеется на блоге? :)

    ОтветитьУдалить
  2. Александр, огромное спасибо. Как раз читаю ваши статьи в блоге по отладке в Delphi, и вебинар был как нельзя кстати. Нет ли у вас планов написать статью о трассировке цепочек ожиданий в потоках (WCT?), которую вы упоминали в вебинаре и http://www.gunsmoker.ru/2010/06/blog-post_08.html и вообще, что это и откуда?

    ОтветитьУдалить
  3. > А запись предыдущего вебинара имеется на блоге?

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

    (по секрету скажу, что у нас накрылась запись, поэтому пришлось делать второй вебинар :) )

    > Нет ли у вас планов написать статью о трассировке цепочек ожиданий в потоках (WCT?)

    С точки зрения программирования или использования?

    Если использования, то что там описывать? Вот, есть такая возможность, показывает, чего ждут потоки, показывает взаимоблокировки, поддерживается такими-то инструментами.

    Если с точки зрения программирования, то может это и было бы интересно, но... для кого? Кто сам разрабатывает инструменты отладки? В общем, планов таких точно нет.

    ОтветитьУдалить
  4. >> Нет ли у вас планов написать статью о трассировке цепочек ожиданий в потоках (WCT?)
    >С точки зрения программирования или использования?

    Использования, точнее, доступности. Извините, я не дочитал еще ваш пост об инстументах отладки.
    "Напомню, что при возможности отладку зависаний стоит производить в ОС Vista и выше - потому что в этих системах появилась новая возможность: Wait Chain Traversal. Отладчик Delphi последних версий поддерживает WCT. Поэтому, если вы используете BDS 2009 или выше и Windows Vista или выше, то в окне Threads напротив каждого потока в колонке "Wait Chain" можно увидеть его статус, чего он ждёт, есть ли взаимоблокировка и т.п."

    Тогда еще пара вопросов:
    1) реально ли после конвертации отладочной информации tds2pdb или map2dbg увидеть в Process Explorer номер строки модуля в стеке вызовов? Сейчас он показывает название модуля, метода и hex-смещение.
    2) на ситуацию в http://support.microsoft.com/kb/2545627 не наталкивались?

    ОтветитьУдалить
  5. Ну вот я могу в Delphi 7 написать класс MyException, который будет точно так же, как d2009 инкапсулировать все исключения-источники (он их будет в конструкторе принимать). Вопрос в том, что с этим делать? Пользователю на это смотреть не интересно. А всякие madExcept на эти данные плювать хотели. Я пробовал это вставлять в развертку стека - фиг, не получается. А новые версии madExcept это поддерживают, но в d2009. А фича, безусловно, очень полезная. Где же справедливость?

    ОтветитьУдалить
  6. > реально ли после конвертации отладочной информации tds2pdb или map2dbg увидеть в Process Explorer номер строки модуля в стеке вызовов?

    По-моему номера строк Process Explorer в принципе не показывает.

    > на ситуацию в http://support.microsoft.com/kb/2545627 не наталкивались?

    Нет.

    > А всякие madExcept на эти данные плювать хотели.

    У "всяких madExcept" должно быть что-то типа OnCustomDataRequest (говорю в терминах EurekaLog) - добавление в отчёт произвольных данных. Вот туда можно что угодно добавлять. В том числе - вложенные исключения.

    Конечно, хорошо бы ещё стек последнего заменить на стек от первого. Ну, тут уж от трейсера зависит, даёт он это сделать или нет. Если не даёт - пихать стек тоже в custom-инфу отчёта.

    > Где же справедливость?

    С такими философскими вопросами - не ко мне :)

    ОтветитьУдалить
  7. И насчет собственных классов исключений (меня тоже несколько удивил подход, представленный в вэбинаре). Вот я пользуюсь трейсером исключений madExcepd и в отчетах он мне точно показывает где произошла ошибка. Свой класс исключений мог бы предоставить мне значения параметров, из-за которых произошло исключение (если я, конечно, смогу правильно предвидеть причины исключительных ситуаций, что не всегда просто, особенно когда вы делаете что-то более сложное, чем открытие файла, или выполнение SQL запроса). К сожалению, madExcept не предоставляет значений параметров стека. Делает ли это EurekaLog? Да и вообще, такое возможно?

    ОтветитьУдалить
  8. > Свой класс исключений мог бы предоставить мне значения параметров, из-за которых произошло исключение

    Надо понимать, что трейсер исключений - дополнительное диагностическое средство. По возможности он не должен быть основой для логики программы в части обработки ошибок.

    Кроме того, свой класс исключений даёт возможность делать фильтрацию в except (без него это надёжно не получится даже с трейсером), а также добавлять доп. данные (которые иначе могли бы поступать только от логгера).

    > К сожалению, madExcept не предоставляет значений параметров стека. Делает ли это EurekaLog? Да и вообще, такое возможно?

    Нет, это невозможно под x86-32, поскольку параметры существуют только в момент вызова функции. Когда вызывается исключение, параметры обычно уже затёрты.

    Но это можно сделать под x86-64, где параметры обязаны сохраняться в стек. Не в курсе про madExcept, но для EurekaLog такая возможность пока в списке TODO.

    ОтветитьУдалить
  9. Про затирание параметров стэка ф-ции, где произошло исключение, при вызове трейсера в X86-32 - это CodeGuard http://docwiki.embarcadero.com/RADStudio/XE3/en/CodeGuard_Errors_Index которого нет в Delphi
    и ваш feature-request http://qc.embarcadero.com/wc/qcmain.aspx?d=82567 ?
    Наверное, надо почитать вашу статью в журнале про особенности отладки в x86-64.

    ОтветитьУдалить
  10. Я не имел в виду баги. Я говорил про штатную ситуацию в x86-32. Проще всего это представить на функции с соглашением вызова register. При вызове функции в регистрах содержатся параметры функции, но буквально первая же команда может их (аргументы) использовать и сохранить в регистр другую информацию. То же справедливо и для стека. Он может быть использован функцией для своих целей. Под x86-32 нет никакого правила "параметры всегда должны быть доступны на стеке" - в отличие от x86-64.

    ОтветитьУдалить
  11. Хотя с этим "обязательно" довольно интересно. Спецификация требует выделять на стеке место под все параметры. Но она не требует его заполнять (поскольку параметры передаются в регистрах). В итоге, отладочный профиль компилятора от MS генерирует код, который заполняет параметры на стеке. Но включение оптимизации заставляет компилятор использовать место на стеке от параметром просто как свободное, для произвольных целей. Компилятор же Delphi не делает различий и всегда компилирует код с заполнением параметров.

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

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и (опционально) ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.