I ask this because I have no good ideas ... hoping for someone else with a fresh perspective.
I have a user who runs our 32-bit Delphi application (compiled with BDS 2006) on a 64-bit Windows 7. Our software was "working fine" until a couple of weeks ago. Now, unexpectedly, this is not the case: it causes an access violation during initialization (instancing objects).
We forced him to reinstall all of our software — starting from scratch. Same AV error. We disabled its antivirus software; same error.
Our stack tracking code ( madExcept ) for some reason could not provide a stack trace in the error line, so we sent a couple of error logging versions for the user to install and run, to isolate the line that generated the error ...
It turns out that this is a line in which instances of a simple descendant of TStringList (there is no overridden constructor for Create, etc.), basically Create is just starting a TStringList, which has several custom methods associated with the descendant class.)
I want to send the user another .EXE test; one that simply enters a regular TStringList to see what happens. But at the moment I feel like windmills are flickering, and I risk enduring the patient’s patience if I send too many “things to try.”
Any fresh ideas on a better approach to debugging this user problem? (I don’t like when problems arise with the user ... those that are usually those that, if ignored, suddenly become an epidemic that 5 other users suddenly “find”.)
EDIT as Lasse requested:
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;
And here is the definition of the created object ...
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;
Mark wilsdorf
source share