Я спрашиваю об этом, потому что у меня нет хороших идей ... надеюсь на чью-то свежую точку зрения.
У меня есть пользователь, запускающий наше 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;