Delphi异常不允许我查看本地变量

6
在Delphi中进行调试时,异常会准确地告诉我导致故障的代码行,但我无法访问任何局部变量。这是调试器的限制吗?还是我遗漏了什么简单的东西?目前,我必须在故障前一行将所有局部变量复制到全局变量中,重新编译程序,并希望能够重复相同的异常。
例如:
MyArray[I]:=Foo(...); 

如果开启了边界检查,I越界时,我将无法看到变量I的值,除非在上一行将其镜像到全局调试变量中。
或者,如果我有以下代码:
MyInteger:=Trunc(MyFloat), 

MyFloat6.1E+17时,我不知道它的值是多少。


这是调试器已知的限制。你没有太多可以做的。 - David Heffernan
我是新来的(第一篇帖子)。我似乎找不到“问题已回答”的选项,但我看到其他人说“记得标记问题已回答”。我该怎么做? - Robert Richter
4
据我回忆,当我遇到这个限制时,罗伯特,我会明确在导致问题的那一行设置断点(假设问题可以重现),以便我可以获取异常之前的本地变量。或者,我会用try...except包围本地代码,并在except块中放置一行代码,以便我可以设置断点。 - RobertFrank
设置断点的问题在于,你可能会处于一个循环中,例如 "for I:=0 to Length(Array) do begin",直到数组的最后一次迭代,你才意识到你走得太远了。 - Robert Richter
@Robert:Delphi允许条件断点。即使您在循环内设置了断点,也可以添加条件,例如“i = 100”。 - Mike W
2个回答

7

当您在调用堆栈窗口中选择正确的行时,可以查看本地变量的值。通常是在异常引发之前的一两行。

我手头没有确切的版本信息,但这绝对是较新版本中的一个功能。


2
我可以确认D7不能,但是D2007可以在调用堆栈中双击适当的行时,在本地变量窗口(尽管不在监视窗口中)显示值。 - Sertac Akyuz
我已验证此在XE3中可行。我不知道为什么每个过程或函数在堆栈跟踪中有两个堆栈,但其中一个会给出极不准确的结果,而另一个则会给出正确的结果。我还没有尝试过任何真正的调试(只是故意引发异常),但我认为99%的时间,很明显哪一个是正确的。 - Robert Richter

1
据我所知,“问题”是由编译器引起的。编译器的优化功能类似于垃圾收集器,它会在不再使用函数内声明的变量时释放它们。
为了克服这个问题,编写一个异常处理程序,并在异常捕获块中对变量进行虚拟使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接