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

有没有一种方法可以拦截使用堆栈跟踪记录在未处理的异常上的文本,以便可以将其写入文件?我不能仅将标准错误传递给文件,因为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


有可能做到这一点吗?

最佳答案

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


Exceptproc处理异常
和backtracestrfunc处理lineinfo检索的地址。


当前处理iirc是分层的


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


简而言之:


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


请注意,执行-gl时会隐式包含lineinfo单元

08-03 22:41