Поймать трассировку стека в Free Pascal - PullRequest
3 голосов
/ 18 декабря 2009

У меня есть консольное приложение, написанное на Free Pascal, которое, как и большинство более крупных приложений, иногда падает. Поскольку это приложение работает, я обычно прошу людей записать меня при трассировке стека - я распространяю его вместе с debug и lineinfo. Однако приложение использует вывод 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

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

1 Ответ

2 голосов
/ 19 декабря 2009

Включены две переменные процедуры (системный блок):

  • Exceptproc , который обрабатывает исключение
  • и backtracestrfunc , который обрабатывает адрес для извлечения lineinfo.

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

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

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

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

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

...