Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi异常不允许我查看局部变量_Delphi - Fatal编程技术网

Delphi异常不允许我查看局部变量

Delphi异常不允许我查看局部变量,delphi,Delphi,在Delphi中调试时,异常将正确地告诉我导致故障的代码行,但我无法访问任何局部变量。这是调试器中的限制吗?还是我错过了一些简单的东西?目前,我必须在故障发生之前将所有局部变量镜像到一个全局变量,重新编译程序,并希望能够重复相同的异常 比如说 MyArray[I]:=Foo(...); 如果I超出边界(启用边界检查),则我无法看到变量I是什么,除非我在前一行将其镜像到全局范围的调试变量 或者如果我有 MyInteger:=Trunc(MyFloat), 而MyFloat是6.1E+17,

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

比如说

MyArray[I]:=Foo(...); 
如果
I
超出边界(启用边界检查),则我无法看到变量
I
是什么,除非我在前一行将其镜像到全局范围的调试变量

或者如果我有

MyInteger:=Trunc(MyFloat), 

MyFloat
6.1E+17
,我不知道它的值是什么。

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

我手头上没有实现此功能时的确切版本,但它肯定是较新版本之一。

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


要解决这个问题,请编写一个异常处理程序,并在异常捕获块中假用该变量

这是调试器的已知限制。你无能为力。我是新来的(第一篇文章)。我似乎找不到“已回答的问题”,但我看到其他人说“记住标记已回答的问题”。我该怎么做?我记得,当我遇到这个限制时,Robert,我在导致问题的行上明确设置了一个断点(假设问题是可复制的)这样我就可以在异常发生之前访问局部变量。或者,我用try…except包围了本地代码,并在except块中放置了一行,我可以在其上设置断点。设置断点的问题是,您可能处于循环中,例如“for I:=0 to Length(Array)do begin”直到数组的最后一次迭代,你才会意识到你做得太过分了。@Robert:Delphi允许条件断点。即使在循环中设置了断点,也可以添加“i=100”这样的条件。我可以确认D7不能,但当双击调用堆栈中的相应行时,D2007可以在局部变量窗口(而不是在监视窗口)中显示值。我验证了这在XE3中是有效的。我不知道为什么堆栈跟踪中的每个过程或函数都有两个堆栈,但其中一个给出了非常不准确的结果,而另一个给出了正确的结果。我还没有尝试过任何真正的调试(只是故意的例外),但我假设99%的时间里,哪一个是正确的是显而易见的。