2012-10-14 56 views
6

在Delphi中调试时,例外会正确告诉我导致错误的代码行,但我无法访问任何本地变量。这是调试器的限制吗?或者我错过了一些简单的东西?目前,我必须在故障发生之前将所有局部变量镜像到全局线上,重新编译程序并希望能够重复相同的异常。德尔福的例外,不让我看到局部变量

例如

MyArray[I]:=Foo(...); 

如果I是出界(与边界检查打开),我不能看到变量I是什么,除非我把它镜像到一个全球范围的调试变量上一行。

或者,如果我有

MyInteger:=Trunc(MyFloat), 

MyFloat6.1E+17,我不知道它的价值。

+0

这是调试器的一个已知限制。没有什么可以做的。 –

+0

我是新来的(第一篇文章)。我似乎无法找到“回答问题”,但我看到其他人说“记得标记回答的问题”。我怎么做? –

+4

我记得,当我遇到这个限制时,Robert,我明确地在引起问题的行上设置了一个断点(假设问题是可重现的),以便我可以在异常之前访问局部变量。或者,我用try ...包围了本地代码,除了在可以设置断点的except块中放置一行外, – RobertFrank

回答

7

当您在调用堆栈窗口中选择适当的行时,可以看到局部变量的值。在引发异常之前,通常是一行或两行。

实施此功能时,我手边没有准确的版本,但它绝对是新版本之一。

+2

我可以确认D7不能,但是D2007可以在调用堆栈中的相应行上双击时在局部变量窗口(不在监视窗口中)显示值。 –

+0

我通过XE3验证了这一点。我不明白为什么堆栈跟踪中的每个过程或函数都有两个堆栈,但其中一个给出的结果非常不准确,但另一个给出了正确的结果。我还没有尝试过任何真正的调试(只是故意的例外),但是我假设有99%的时间,很明显哪一个是正确的。 –

1

就我所知,“问题”是由编译器引起的。编译器的优化功能就像一个垃圾回收器,它在不再使用时释放函数中声明的变量。

为了克服这个问题,编写一个异常处理程序并在异常catch块中伪造一个变量。