delphi – 如何调试(可能的)RTL问题?

前端之家收集整理的这篇文章主要介绍了delphi – 如何调试(可能的)RTL问题?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我问这个是因为我有好主意…希望别人有新观点.

我有一个用户Windows 7 64位系统上运行我们的32位Delphi应用程序(使用BDS 2006编译).我们的软件在几周前“工作正常”.现在突然不是:它在初始化(实例化对象)时抛出了访问冲突.

我们让他重新安装了我们所有的软件 – 从头开始​​.相同的AV错误.我们禁用了他的反病毒软件;同样的错误.

我们的堆栈跟踪代码(madExcept)由于某种原因无法为错误行提供堆栈跟踪,因此我们发送了几个错误日志版本供用户安装和运行,以隔离生成的行错误

事实证明,它是一个实例,它是一个简单的TStringList后代(没有重写的Create构造函数等等) – 基本上Create只是实例化一个TStringList,它有一些与后代类关联的自定义方法.)

我很想向用户发送另一个测试.EXE;只是一个普通的TStringList实例,看看会发生什么.但是在这一点上,我觉得我在风车上挣扎,如果我发送了太多“尝试的东西”,那么冒着让用户忍耐的风险.

有关更好地调试此用户问题的方法的任何新想法? (我不喜欢拯救用户的问题……那些被忽视的人突然变成了其他5个用户突然“找到”的流行病.)

按照Lasse的要求编辑:

procedure T_fmMain.AfterConstruction;
begin
  inherited;
      //Logging shows that we return from the Inherited call above,//then AV in the following line...
  FActionList := TAActionList.Create;
  ...other code here...
end;

这是创建对象的定义……

type
  TAActionList = class(TStringList)
  private
    FShadowList: TStringList;              //UPPERCASE shadow list
    FIsDataLoaded : boolean;
  public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    procedure DataLoaded;
    function Add(const S: string): Integer; override;
    procedure Delete(Index : integer); override;
    function IndexOf(const S : string) : Integer; override;
  end;

implementation

procedure TAActionList.AfterConstruction;
begin
  Sorted := False;              //until we're done loading
  FShadowList := TStringList.Create;
end;

解决方法

我讨厌这些问题,但我认为你应该关注最近在对象试图构建之前发生的事情.

你描述的症状听起来像典型的堆腐败,所以也许你有类似……

>正在写入外部边界的数组? (转动边界检查,如果你关闭它)
>代码尝试访问已删除的对象?

自从我上面的回答,你已经发布了代码片段.这确实引发了我可以看到的几个可能的问题.

a:AfterConstruction与修改后的构造函数
正如其他人所提到的,以这种方式使用AfterConstruction充其量不是惯用语.我不认为它真的是“错误的”,但这可能是一种气味.这些方法Dr. Bob’s site here.上有很好的介绍

b:重写方法Add,Delete,IndexOf我猜这些方法以某种方式使用FshadowList项.在创建FShadowList之前,是否可以远程调用这些方法(因此使用FShadowList)?这似乎是可能的,因为您正在使用上面的AfterConstruction方法,此时虚拟方法应该“工作”.希望通过设置一些断点并查看它们被命中的顺序,可以很容易地通过调试器进行检查.

猜你在找的Delphi相关文章