在Delphi中调试时,异常会正确地告诉我导致错误的代码行,但我无法访问任何局部变量.这是调试器中的限制吗?还是我错过了一些简单的东西?目前,我必须将所有局部变量镜像到故障前的全局变量,重新编译程序并希望能够重复相同的异常.
例如
MyArray[I]:=Foo(...);
Run Code Online (Sandbox Code Playgroud)
如果I超出范围(边界检查打开),我无法看到变量I是什么,除非我将它镜像到前一行的全局范围调试变量.
或者,如果我有
MyInteger:=Trunc(MyFloat),
Run Code Online (Sandbox Code Playgroud)
和MyFloat是6.1E+17的,我不知道它的价值.
当在Delphi中发生无限循环时,调试器在我按下停止按钮时甚至不会给我一个堆栈跟踪.如果我怀疑程序停止的位置,我可以设置断点,如果这是正确的无限循环,它将停止.
这是一个故意导致无限循环的示例程序:
procedure TForm1.btnDebugInfiniteLoopClick(Sender: TObject);
var I: Integer;
begin
I:=0;
while I<100 do begin
I:=1+1;
if I>64 then I:=I div 2;
end;
end;
Run Code Online (Sandbox Code Playgroud)
当停止时,我得到的东西看起来像:
ntdll.RtlUserThreadStart:
776301B4 89442404 mov [esp+$04],eax
776301B8 895C2408 mov [esp+$08],ebx
776301BC E9E99C0200 jmp $77659eaa
776301C1 8DA42400000000 lea esp,[esp+$0000]
776301C8 8DA42400000000 lea esp,[esp+$0000]
776301CF 90 nop
ntdll.KiFastSystemCall:
776301D0 8BD4 mov edx,esp
...
Run Code Online (Sandbox Code Playgroud)
当我单步(F7)时,它单步几行,然后锁定直到我再次击中,此时我得到相同的结果.
我正在编写一个Delphi(XE3)应用程序,其中鼠标位置很重要,但我希望能够使用另一个鼠标来设置断点而无需移动主鼠标位置.我可能在我试图调试的应用程序中按下shift或control,因此alt-tabbing到IDE并使用键盘键盘设置断点将不起作用.Windows 7可以轻松设置来执行此操作吗?