在 Free Pascal 中捕获堆栈跟踪

发布于 2024-08-15 11:14:24 字数 664 浏览 7 评论 0原文

我有一个用 Free Pascal 编写的控制台应用程序,与大多数大型应用程序一样,它有时会崩溃。由于这个应用程序是实时的,我通常会要求人们在崩溃时写下堆栈跟踪——我将它与调试和线路信息一起分发。但是,应用程序使用 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

有可能干净地做到这一点吗?

I have a console application written in Free Pascal, that like most larger applications sometimes crashes. As this application is live, I usually ask people to write me down the stack-trace on crash -- I distribute it with both debug and lineinfo. However, the application uses FPC video.pas output, and sometimes the text output stacktrace is not visible.

Is there a way to intercept the text that is written on unhandled exceptions WITH the stack trace, so I can write it to file? I can't just pipe standard error to a file, because FPC video somehow doesn't work with that, and also I'd like people just running the executable not a batch or shell file.

As an example, I'd like to catch this to a file or other output source:

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

Any possibility to do that cleanly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我乃一代侩神 2024-08-22 11:14:24

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

  • 处理异常的 Exceptproc
  • 和处理行信息检索地址的 backtracestrfunc

当前的处理 iirc 是分层的,

  • 系统单元仅因错误而终止,但定义了上述过程变量来覆盖它。
  • sysutils 单元将 RTE 转换为语言异常,并使用默认语言异常处理程序 (sysutils.catchunhandledException) 覆盖 exceptproc
  • backtracestrfunc 过程变量提供线路信息。

简而言之:

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

请注意,当您执行以下操作时,将隐式包含 lineinfo 单元 -格

There are two (system unit) procedure variables involved:

  • Exceptproc which handles the exception
  • and backtracestrfunc that handles address to lineinfo retrieval.

The current handling iirc is layered

  • the system unit only terminates with an error but defines above procedure variables to override this.
  • the sysutils unit converts RTEs to an language exception and overrides exceptproc with a default language exception handler (sysutils.catchunhandledexception)
  • the lineinfo (for stabs) or the linfodward (dwarf, 2.4.0+) units override the backtracestrfunc procedure variable to provide the lineinfo.

So in short:

  • copy the sysutils.catchunhandledexception routine to your own code.
  • only modify the way the copy does output in some way that you like, and make it rock solid (since exceptions during exceptions are confusing and annoying)
  • assign the functionanme of the copy to exceptproc

Note that the lineinfo unit is implicitely included when you do -gl

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文