Отлов трассировки стека в Free Pascal

У меня есть консольное приложение, написанное на Free Pascal, которое, как и большинство более крупных приложений, иногда дает сбой. Поскольку это приложение работает, я обычно прошу людей записать мне трассировку стека при сбое — я распространяю его как с отладочной информацией, так и с линейной информацией. Однако приложение использует вывод FPC video.pas, и иногда трассировка стека текстового вывода не видна.

Есть ли способ перехватить текст, записанный в необработанных исключениях, С помощью трассировки стека, чтобы я мог записать его в файл? Я не могу просто передать стандартную ошибку в файл, потому что видео FPC почему-то не работает с этим, а также я бы хотел, чтобы люди просто запускали исполняемый файл, а не пакетный файл или файл оболочки.

В качестве примера я хотел бы поймать это в файл или другой источник вывода:

ERangeError : Range check error∙
  $0048C0EA  TCELLS__GETCELL,  line 104 of dfmap.pas
  $004AD133  TDOOMGENERATOR__GENERATECITYDUNGEON,  line 397 of dfdungen.pas
  $004AF87D  TDOOMGENERATOR__GENERATE,  line 760 of dfdungen.pas
  $0041293B  TDOOM__RUN,  line 354 of doombase.pas
  $00401CD6  main,  line 51 of doomrl.pas

Есть ли возможность сделать это чисто?


person Kornel Kisielewicz    schedule 17.12.2009    source источник


Ответы (1)


Задействованы две (системные единицы) процедурные переменные:

  • Exceptproc, который обрабатывает исключение
  • и backtraestrfunc, который обрабатывает поиск адресной и линейной информации.

Текущая обработка iirc многоуровневая

  • системный модуль завершается только с ошибкой, но определяет вышеуказанные переменные процедуры, чтобы переопределить это.
  • модуль sysutils преобразует RTE в языковое исключение и заменяет exceptproc обработчиком языковых исключений по умолчанию (sysutils.catchunhandledexception)
  • юниты lineinfo (для ударов) или linfodward (карлики, 2.4.0+) переопределяют процедурную переменную backtracestrfunc для предоставления информации о линии.

Итак, вкратце:

  • скопируйте подпрограмму sysutils.catchunhandledexception в свой собственный код.
  • только измените способ вывода копии так, как вам нравится, и сделайте его надежным (поскольку исключения во время исключений сбивают с толку и раздражают)
  • назначьте функцию копии для excludeproc

Обратите внимание, что модуль lineinfo неявно включается, когда вы делаете -gl

person Marco van de Voort    schedule 19.12.2009
comment
Большое спасибо, почему-то я ожидал, что вы будете единственным, кто знает ответ :› - person Kornel Kisielewicz; 19.12.2009
comment
Нет, я всего лишь один из младших разработчиков FPC. - person Marco van de Voort; 20.12.2009