zoukankan      html  css  js  c++  java
  • 【MyBean调试笔记】接口的使用和清理

    【DEMO信息】

       有问题的DEMO, 由芒果提交

    【问题描述】

    双击Tab页面关闭页面和插件的时候出现AV异常

       image

    【问题调试】

    我们在调试的时候出现这个错误时断点停在这里

    image

    可以看到停留在这个位置@IntfClear,指针清理的位置

    image

    好我们来调试下这个过程,跟一下是什么时候出现的, 在end 处下个断点后切换到cpu页,我们看到在ret之前调用了一过程,这个地址应该是做一些清理工作后然后返回到调用者地址,

    `TDZCGURW[(RGU7B72)5CNY

    跟进去后,一会就跳到错误的界面,可以说明在清理时出现的,这个时候我们来看看这段代码

    procedure TfrmMain.pgcMainMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      Index: Integer;
      lvPluginForm: IPluginForm;
      lvTabShtEx:TTabShtEx;
    begin
      // 左键点击并且双击
      if (Button = mbLeft) and (ssDouble in Shift) then
      begin
        Index := pgcMain.IndexOfTabAt(X, Y);
        if Index >= 0 then
        begin
          lvTabShtEx := TTabShtEx(pgcMain.Pages[Index]);
          lvPluginForm := lvTabShtEx.PluginForm;
          if Application.MessageBox('确认要关闭画面吗?', '询问', MB_OKCANCEL + MB_ICONQUESTION) = IDCANCEL then
            Exit;
          lvPluginForm.freeObject;
          pgcMain.Pages[Index].Free;
        end;
      end;
    end;

    这段代码中有一个lvPluginForm为接口IPluginForm变量, 过程在退出时会执行lvPluginForm := nil和其他一些资源的清理工作,清理的时候会触发对象的__release方法,但是我们看到这个对象已经释放掉了,然后在进行清理的时候出现了上面看到的访问违规的错误。

    【问题解决】

    找到出现问题的根本,解决起来就很快了,尽量不要等到过程清理时在去清理你的资源,特别是可能访问不存在的资源。在end;之前 加一句lvPluginForm := nil;这样就好了

  • 相关阅读:
    【C#】SuperSocket配置启动UDP服务器
    【UWB】DWM1000 室内定位串口协议说明
    【Unity3D】把相机视角放置到编辑器当前位置视角
    【DXP】如何在原理图中批量修改
    request中的gizp提交解析以及提交请求
    java基础知识----循环
    pymongo.errors.CursorNotFound: Cursor not found
    xposed入门(二)---hook方法入参
    VulnHub靶场篇9-SkyTower: 1
    VulnHub靶场篇8-IMF:1
  • 原文地址:https://www.cnblogs.com/DKSoft/p/4093285.html
Copyright © 2011-2022 走看看