在Free Pascal中捕获堆栈跟踪

3
我有一个用Free Pascal编写的控制台应用程序,像大多数较大的应用程序一样,有时会崩溃。由于该应用程序是实时的,我通常会要求人们在崩溃时将堆栈跟踪记录下来--我会分发带有调试和行信息的堆栈跟踪。然而,该应用程序使用FPC video.pas输出,有时文本输出的堆栈跟踪不可见。
有没有办法拦截未处理异常时写入的文本及其堆栈跟踪,以便我可以将其写入文件?我不能只将标准错误管道传输到文件中,因为FPC video似乎与此不兼容,而且我希望人们只运行可执行文件而不是批处理或shell文件。
例如,我想将这个内容捕捉到文件或其他输出源:
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
有两个(系统单元)过程变量涉及:
- Exceptproc 处理异常 - Backtracestrfunc 处理地址到行信息的检索。
当前处理是分层的:
- 系统单元仅以错误终止,但定义上述过程变量以覆盖此操作。 - Sysutils 单元将 RTE 转换为语言异常,并使用默认语言异常处理程序(sysutils.catchunhandledexception)覆盖 exceptproc。 - Lineinfo(用于 stabs)或 linfodward(dwarf,2.4.0+)单元覆盖 backtracestrfunc 过程变量以提供行信息。
简而言之:
- 将 sysutils.catchunhandledexception 例程复制到您自己的代码中。 - 只修改副本的输出方式,使其更符合您的喜好,并使其牢固可靠(因为异常期间的异常会让人感到混乱和恼怒)。 - 将副本的函数名称赋值给 exceptproc。
请注意,当您执行 -gl 时,lineinfo 单元会被隐式包含。

非常感谢,不知怎么的我就觉得你是唯一知道答案的人:> - Kornel Kisielewicz
不,我只是FPC开发人员中的一个小角色。 - Marco van de Voort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接