Stacktrace

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Stacktrace

Beitragvon fliegermichl » 4. Jun 2019, 11:58 Stacktrace

Kann mir denn mal bitte einer erklären, wie ich einen gescheiten Stacktrace bekomme?
Mein Programm ist mit Debuginfos compiliert und plötzlich erscheint eine Exception und der Stacktrace zeigt das da. Damit kann doch kein Mensch was anfangen.

stacktrace.PNG
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 367
Registriert: 9. Jun 2011, 09:42

Beitragvon martin_frb » 4. Jun 2019, 14:42 Re: Stacktrace

Debuginfo: Stabs oder Dwarf? Dwarf ist meist besser (Aber Stabs teilweise fpc's Default)
Unbedingt mit -O- (Ohne Optimization) kompilieren. Und ohne Smart-linking.

Wenn der Fehler in der RTL ist, hilft es ggf eine RTL mit debug info zu verwenden. Obwohl oft wird der Teil ausserhalb der RTL auch gefunden, wenn die RTL keine info hat.

Der Stack im Bild scheint komplett unsinnig. fpc_fillmem ruft NICHT fpc_objectcheck auf....

Es kann sein, das der Fehlerhafte Code vor dem run-error Teile des Stack überschrieben hat. Wenn die Daten des Stack auf diese Weise vernichtet wurden, dann lässt sich kein Stack mehr anzeigen.
martin_frb
 
Beiträge: 442
Registriert: 25. Mär 2009, 22:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other | 
CPU-Target: mostly 32 bit
Nach oben

Beitragvon Warf » 4. Jun 2019, 16:55 Re: Stacktrace

Diese fehler treten auf wenn du schweinereien mit strings gemacht hast (internals von strings wie refcount etc überschrieben). (Oder dynamische arrays, der stack trace mit fpc_ansistr_assign deutet aber auf strings hin)
Diese fehler treten dann beim verlassen von funktionen auf (wenn der fpc versucht deinen kaputten string aufzuräumen), daher ist es ganz tief in den FPC internals, weshalb der stacktrace fürn arsch ist.

Typische quellen für solche fehler: PChar rumgehampel, FillChar auf nem record mit AnsiStrings, Pointer Rumgehampel auf nem Record mit AnsiStrings, Memset, memcpy, etc. auf dem String gemacht, index 0 statt 1 für pointer zugriff genommen, etc.
Warf
 
Beiträge: 1183
Registriert: 23. Sep 2014, 17:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon fliegermichl » 5. Jun 2019, 08:49 Re: Stacktrace

Hmm, kann schon mit Strings zusammenhängen. Das ganze tritt im Zusammenhang mit dem VirtualStringTree auf.

Ich habe eine Basisklasse TTextBase. Diese definiert eine virtuelle Methode function GetText(Column : integer; tt : TVSTTextType = ttNormal) : string;
Die davon abgeleiteten Klassen TTextGruppe, TEinzelText, TText usw. überschreiben diese und im OnGetText Event steht dann:

Code: Alles auswählen
 
procedure TTextToolMainform.AntwortTreeGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: String);
begin
  if Assigned(Node) then
  if Assigned(Node^.Daten) then
   CellText := TTextBase(Node^.Daten).GetText(column);
end;
 


Ich habe den record TVirtualNode um einen Pointer Daten erweitert. Dann brauche ich nicht jedesmal mit GetNodeData usw. rummachen weil bei mir immer eine Klasseninstanz da dranhängt.

Aber kein wildes PChar Gehampel usw.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 367
Registriert: 9. Jun 2011, 09:42

Beitragvon fliegermichl » 5. Jun 2019, 09:02 Re: Stacktrace

Hab's gefunden. Klassiker: Free statt FreeAndNil :-(
fliegermichl
Lazarusforum e. V.
 
Beiträge: 367
Registriert: 9. Jun 2011, 09:42

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried