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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
-
- Beiträge: 586
- 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
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.
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.
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
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.
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.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
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:
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.
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;
Aber kein wildes PChar Gehampel usw.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Stacktrace
Hab's gefunden. Klassiker: Free statt FreeAndNil 
