Stacktrace

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Stacktrace

Beitrag von fliegermichl »

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

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Stacktrace

Beitrag von martin_frb »

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.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Stacktrace

Beitrag von Warf »

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.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Stacktrace

Beitrag von fliegermichl »

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.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Stacktrace

Beitrag von fliegermichl »

Hab's gefunden. Klassiker: Free statt FreeAndNil :-(

Antworten