Как отладить (возможную) проблему RTL?

Я спрашиваю об этом, потому что у меня нет хороших идей ... надеюсь на чью-то свежую точку зрения.

У меня есть пользователь, запускающий наше 32-битное приложение Delphi (скомпилированное с помощью BDS 2006) на 64-битная система Windows 7. Наше программное обеспечение «работало нормально» еще пару недель назад. Теперь внезапно это не так: он вызывает нарушение прав доступа при инициализации (создание экземпляров объектов).

Мы заставили его переустановить все наше программное обеспечение - начиная с нуля. Та же ошибка AV. Мы отключили его антивирусное ПО; та же ошибка.

Наш код трассировки стека ( madExcept ) по какой-то причине не смог предоставить трассировку стека до строки с ошибкой, поэтому мы отправили пару версий журнала ошибок для пользователь для установки и запуска, чтобы изолировать строку, которая генерирует ошибку ...

Оказывается, это строка, которая представляет собой простой потомок TStringList (нет переопределенного конструктора Create и т. д.). По сути, Create просто создает экземпляр TStringList, у которого есть несколько специальных методов, связанных с классом-потомком.)

У меня возникло искушение послать пользователю еще один тест .EXE; тот, который просто создает простой TStringList, чтобы посмотреть, что произойдет. Но в этот момент мне кажется, что я бьюсь о ветряные мельницы, и рискую истощить терпение пользователя, если я пришлю слишком много «вещей, чтобы попробовать».

Есть ли свежие идеи по лучшему подходу к отладке проблемы этого пользователя? (Мне не нравится выручать пользователя из-за проблем ... как правило, это те, которые, если их игнорировать, внезапно превращаются в эпидемию, которую внезапно «обнаруживают» 5 других пользователей.)

ИЗМЕНИТЬ, как просил Лассе:

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;

7
задан Mark Wilsdorf 13 May 2011 в 23:16
поделиться