Delphi 如何定位“的来源”;无效浮点“;没有调试器的异常?

Delphi 如何定位“的来源”;无效浮点“;没有调试器的异常?,delphi,debugging,delphi-6,Delphi,Debugging,Delphi 6,我的系统可以正常运行数小时。 突然抛出无效的浮点异常。 它不会发生: -在调试器中运行时 -在所有计算机中 如果没有调试器,如何确定引发异常的位置? 我使用Delphi6 通过日志记录和异常跟踪的组合。 这意味着您的系统必须部署调试信息。对您来说似乎不是问题,但有时对box软件来说却是问题 有很多工具可以做到这一点,但可能不是所有的工具都仍然兼容Delphi-6。举几个例子: 因此,您必须更改默认的异常处理程序(在TApplication、ExceptProc或其他任何程序中,这些源

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

如果没有调试器,如何确定引发异常的位置?

我使用Delphi6

通过日志记录和异常跟踪的组合。 这意味着您的系统必须部署调试信息。对您来说似乎不是问题,但有时对box软件来说却是问题

有很多工具可以做到这一点,但可能不是所有的工具都仍然兼容Delphi-6。举几个例子:

因此,您必须更改默认的异常处理程序(在
TApplication
ExceptProc
或其他任何程序中,这些源代码中的工具将向您展示如何执行该操作)并记录浮点异常(您现在几乎不会对所有可能的异常感兴趣)

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

现在您运行服务一段时间,它会保存所有与FP相关的异常及其堆栈跟踪。如果您在编译时禁用了一些优化(如“始终生成堆栈帧”),它可能还会显示一些局部变量和参数

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

在这种情况下,您至少会有到错误的堆栈跟踪(执行路径)(或者有几个到您认为是一个错误的几个类似错误的路径)。 在这一点上,您将主要精力转移到日志记录上。了解执行路径后,可以沿执行路径记录所有感兴趣的函数参数和局部变量,并查看这些变量在记录的异常之前是如何获得异常值的(以及如果现在发生异常,这些值是如何正常的)


您需要进行多次迭代,首先将搜索向下扩展到调用堆栈,向日志添加更多的参数和变量,并可能在日志中包含一些附带例程,不直接在调用堆栈中,但在异常之前被调用,并在错误之前影响本地VAR值。

通过日志记录和异常跟踪的组合。 这意味着您的系统必须部署调试信息。对您来说似乎不是问题,但有时对box软件来说却是问题

有很多工具可以做到这一点,但可能不是所有的工具都仍然兼容Delphi-6。举几个例子:

因此,您必须更改默认的异常处理程序(在
TApplication
ExceptProc
或其他任何程序中,这些源代码中的工具将向您展示如何执行该操作)并记录浮点异常(您现在几乎不会对所有可能的异常感兴趣)

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

现在您运行服务一段时间,它会保存所有与FP相关的异常及其堆栈跟踪。如果您在编译时禁用了一些优化(如“始终生成堆栈帧”),它可能还会显示一些局部变量和参数

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

在这种情况下,您至少会有到错误的堆栈跟踪(执行路径)(或者有几个到您认为是一个错误的几个类似错误的路径)。 在这一点上,您将主要精力转移到日志记录上。了解执行路径后,可以沿执行路径记录所有感兴趣的函数参数和局部变量,并查看这些变量在记录的异常之前是如何获得异常值的(以及如果现在发生异常,这些值是如何正常的)


您需要进行多次迭代,首先将搜索向下扩展到调用堆栈,向日志添加更多的参数和变量,并可能在日志中包含一些附带例程,不直接在调用堆栈中,但在异常之前被调用,并在错误发生之前影响本地VAR值。

将madExcept放入进程并从生成的错误报告中读取堆栈跟踪将madExcept放入进程并从生成的错误报告中读取堆栈跟踪