在Free Pascal中捕获堆栈跟踪

时间:2009-12-17 23:51:53

标签: console pascal lazarus freepascal

我有一个用Free Pascal编写的控制台应用程序,就像大多数大型应用程序有时会崩溃一样。由于这个应用程序是实时的,我通常会要求人们在崩溃时写下我的堆栈跟踪 - 我用debug和lineinfo分发它。但是,应用程序使用FPC video.pas输出,有时文本输出堆栈跟踪不可见。

有没有办法拦截写入堆栈跟踪的未处理异常的文本,所以我可以将其写入文件?我不能只将标准错误传递给文件,因为FPC视频不能用于此,我也希望人们只运行可执行文件而不是批处理文件或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 个答案:

答案 0 :(得分:2)

涉及两个(系统单元)程序变量:

    处理异常的
  • Exceptproc
  • 处理地址到lineinfo检索的
  • backtracestrfunc

当前处理iirc是分层的

  • 系统单元仅以错误终止,但定义了上述过程变量以覆盖此错误。
  • sysutils单元将RTE转换为语言异常,并使用默认语言异常处理程序(sysutils.catchunhandledexception)覆盖 exceptproc
  • lineinfo(用于stabs)或linfodward(dwarf,2.4.0 +)单位覆盖 backtracestrfunc 过程变量以提供lineinfo。

简而言之:

  • 将sysutils.catchunhandledexception例程复制到您自己的代码中。
  • 只修改副本以您喜欢的方式输出的方式,并使其坚如磐石(因为异常期间的例外令人困惑和恼人)
  • 将副本的功能分配给exceptproc

请注意,当您执行-gl

时,会明确包含lineinfo单元