如何在没有调试器的情况下找到“无效浮点”异常的来源?

时间:2016-04-05 08:50:09

标签: delphi debugging delphi-6

我的系统运行数小时没有问题 突然它抛出了无效的浮点异常 它不会发生:
- 在调试器中运行时 - 在所有计算机中

如果没有调试器,如何确定抛出异常的位置? 我使用的是Delphi 6.

1 个答案:

答案 0 :(得分:4)

结合使用日志记录和异常跟踪。 这意味着您的系统必须部署调试信息。对您来说似乎不是问题,但有时候是盒子软件的问题。

有很多工具可以做到,但也许并非所有工具都兼容Delphi-6。仅举几例:

所以你必须更改默认异常处理程序(在TApplicationExceptProc或其他任何东西 - 它们的源中的那些工具会告诉你如何做)并记录浮点异常(你很难现在对所有可能的例外感兴趣。

这带来了另一个问题:日志框架。上面的一些lib已经有了它,有些需要一个额外的库。你现在已经需要它了,你甚至需要它。

现在您运行服务一段时间,它会不断保存所有与FP相关的异常及其堆栈跟踪。如果您在禁用某些优化的情况下编译它(例如"总是生成堆栈帧"),它可能还会显示一些局部变量和参数。

如果你很幸运 - 这足以让你了解错误是如何发生的。但很可能你会看到即时错误的情况,但不会看到它们是如何从失败的初始假设中发展出来的。

在这种情况下,您至少会拥有错误的堆栈跟踪(执行路径)(或者您知道的一些类似错误的路径很少)。 此时,您将主要工作转移到日志记录中。了解执行路径后,您可以在执行路径中记录所有有趣的函数参数和局部变量,并查看这些变量在记录的异常之前如何获得异常值(以及如果现在发生异常,值是如何正常的)。

您必须进行多次迭代,首先将搜索扩展到调用堆栈,添加更多params和vars进行日志记录,并且可能包括一些日志记录,这些例程不直接在调用堆栈中但是在异常之前调用并在错误之前影响局部变量值。