在D2007调试器中启动应用程序,暂停并继续运行(通过按F9键)时,我们经常会遇到崩溃的情况。例如

  • 创建一个VCL应用程序
  • 在主表单
  • 上放置一个TButton和一个TEdit
  • 为Button1添加此OnClick处理程序:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
    begin
      while True do
      begin
        for i := 0 to 9999 do
          Edit1.Text := IntToStr(Random(i));
        Application.ProcessMessages;
      end;
    end;
    
  • 保存并调试应用程序
  • 按下Button1
  • 聚焦IDE
  • 单击“暂停”按钮
  • 按F9。

  • 几乎总是我们遇到访问冲突。我在Windows 7/64位环境下测试了此,我的同事在XP/32位环境下进行了测试。在我同事的D2006中,我们无法重现此错误。

    你能重现吗?任何想法如何解决?

    最佳答案

    我们在D2010中(以及之前的D2007中)也时不时有此功能,但是我无法重现。
    (我们也使用Win7 64位)
    我会尝试用您的测试应用程序重现它,谢谢!现在希望可以通过某种方式解决此问题...

    编辑:无法在D2010中重现此内容...将尝试D2007

    Edit2:但是我可以在D2007中重现它!
    我在事件日志中也得到了一些奇怪的错误:

    Debug Output:    *** A stack buffer overrun occurred in   "C:\test\Project7.exe" :   Process Project7.exe (2584)
    Debug Output: This is usually the result of a memory copy to a local buffer or structure where the size is not properly calculated/checked.  Process Project7.exe (2584)
    Debug Output: If this bug ends up in the shipping product, it could be a severe security hole.  Process Project7.exe (2584)
    Debug Output: The stack trace should show the guilty function (the function directly above __report_gsfailure).  Process Project7.exe (2584)
    Debug Output:  *** enter .exr 772B43D0 for the exception record  Process Project7.exe (2584)
    Debug Output:  *** then kb to get the faulting stack   Process Project7.exe (2584)
    

    当我使用堆栈查看器(http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer)和当前Delphi线程的原始堆栈跟踪(产生错误?)时,我看到以下堆栈:
    [772791B3]{ntdll.dll   } RtlUnhandledExceptionFilter + $12
    [7725CDF4]{ntdll.dll   } Unknown function at CsrVerifyRegion + $1B0
    [771D28A6]{ntdll.dll   } memcpy + $5E6
    [7725CDE4]{ntdll.dll   } Unknown function at CsrVerifyRegion + $1A0
    [7725CDF4]{ntdll.dll   } Unknown function at CsrVerifyRegion + $1B0
    [77243509]{ntdll.dll   } Unknown function at RtlUlonglongByteSwap + $16299
    [771F6AC9]{ntdll.dll   } Unknown function at RtlDosSearchPath_Ustr + $ADA
    [771F6ADD]{ntdll.dll   } Unknown function at RtlDosSearchPath_Ustr + $AEE
    [771F6A9B]{ntdll.dll   } Unknown function at RtlDosSearchPath_Ustr + $AAC
    [77220AE5]{ntdll.dll   } Unknown function at WinSqmSetIfMaxDWORD + $35
    [771F6A3D]{ntdll.dll   } Unknown function at RtlDosSearchPath_Ustr + $A4E
    [77220AE5]{ntdll.dll   } Unknown function at WinSqmSetIfMaxDWORD + $35
    [6E931AE0]{AcLayers.DLL} Unknown function at NotifyShims + $73B6
    [771C010F]{ntdll.dll   } KiUserExceptionDispatcher + $F
    [6E931AE0]{AcLayers.DLL} Unknown function at NotifyShims + $73B6
    [771E9960]{ntdll.dll   } Unknown function at RtlQueryEnvironmentVariable + $241
    [6E8E0000]{AcLayers.DLL}  + $0
    [771EA172]{ntdll.dll   } Unknown function at RtlAllocateActivationContextStack + $1CF
    [6E8E1FFF]{AcLayers.DLL}  + $0
    [6E8E0000]{AcLayers.DLL}  + $0
    [768F4AF9]{ole32.dll   } Unknown function at ObjectStublessClient31 + $4AF6
    [772B206C]{ntdll.dll   } NlsAnsiCodePage + $205C
    [771EA14C]{ntdll.dll   } Unknown function at RtlAllocateActivationContextStack + $1A9
    [6E8E1FFF]{AcLayers.DLL}  + $0
    [77220AE5]{ntdll.dll   } Unknown function at WinSqmSetIfMaxDWORD + $35
    [771E9E5C]{ntdll.dll   } Unknown function at RtlDecodePointer + $F7
    [768F4B4D]{ole32.dll   } Unknown function at ObjectStublessClient31 + $4B4A
    [77220AE5]{ntdll.dll   } Unknown function at WinSqmSetIfMaxDWORD + $35
    [771E9E89]{ntdll.dll   } LdrInitializeThunk + $10
    [771B0000]{ntdll.dll   }  + $0
    [771B0000]{ntdll.dll   }  + $0
    [7720EAB0]{ntdll.dll   } RtlExitUserThread + $0
    [771C0190]{ntdll.dll   } RtlUserThreadStart + $0
    

    我搜索了“AcLayers.DLL”(因为我也有点奇怪),我发现了一篇有关Vista兼容模式和奇怪崩溃的文章(http://www.nynaeve.net/?p=62)。 D2007与Win7不兼容?

    编辑3:当我在没有兼容模式的情况下运行D2007(?,仅运行exe,而不使用任务栏中的固定项目!)时,我得到的错误更少,并且堆栈不再显示AcLayers.DLL,但是我可以那就不知道出了什么问题(需要更多的调查,现在没有更多的时间了)

    10-05 22:16