Irgendwas habe ich verändert, beim Beenden des Programms (irgendwann nach Close, Closequery, destroy) erscheint jetzt immer die Meldung:
Projekt xyz hat Exception-Klasse "External: SIGSEGV" ausgelöst.
Bei Adresse F97FC6DC
Habe ich mit diesen Angaben irgendeine Möglichkeit die Stelle im Source-Code zu ermitteln, wo das Problem auftritt?
Es erscheint so ein Assembler-Fenster, aber wenn ich die o.g. Adresse dort eingebe, passiert nichts.
Edit: Den Fehler habe ich gefunden, habe eine Critical-Section zweimal freigegeben (im Destroy der Form und in einem Finalization-Abschnitt einer Unit).
Dennoch die Frage: Wie kann mir Lazarus helfen, mit Bordmitteln diesen Fehler zu finden?
External SIGSEGV, Bei Adresse...
-
- Lazarusforum e. V.
- Beiträge: 3177
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: External SIGSEGV, Bei Adresse...
Bei Objekten kannst du die folgendes machen:harrybonn hat geschrieben:Dennoch die Frage: Wie kann mir Lazarus helfen, mit Bordmitteln diesen Fehler zu finden?
- nach jeder Freigabe (Destroy oder Free) alle Objektreferenzen auf nil setzen (oder FreeAndNil verwenden)
- Compiler-Option -CR setzen
Wenn das nicht geht: keine Chance bzw. saubere Regeln für das Erstellen und Freigeben von Objekten konsequent umsetzen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: External SIGSEGV, Bei Adresse...
Im ASM Debugger wird dir der Funktionsname angezeigt in der der Fehler auftritt, außerdem: SIGSEGV ist eine Segmentation Fault, also ein Zugriff auf einen nicht allozierten Speicherbereich, das sind eigentlich immer entweder noch nicht Initialisierte oder bereits gefreete Objekte/pointer. Am besten dann wenn der Fehler auftritt in der Funktion einen Breakpoint setzen und sich durchklicken, so kann man den Fehler auf eine Zeile reduzierenharrybonn hat geschrieben:Dennoch die Frage: Wie kann mir Lazarus helfen, mit Bordmitteln diesen Fehler zu finden?
-
- 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: External SIGSEGV, Bei Adresse...
F97FC6DC
Das ist wahrscheinlich im Kernel (oder ggf einel dll). Kann aber auch sein, das es im "nirgendwo" ist.
Wenn die CriticalSection ueber das Betriebsystem verwaltet wird, dann ist die 2te freigabe ein Aufruf ans OS mit illegalen Werten, and stuerzt im Kernel ab, oder kann irgendwo in einen zufaelligen speicher umgeleited werden (wo dann random data, statt assembler ist).
In solch einem Falle ist zum Zeitpunkt des Fehlers hauefig auch der Stack unlesbar. Es gibt keine moeglichkeit vom Fehler den Quellkode zu finden.
Man kann dann nur viele breakpoints setzen, und sich merken welche als letzter korrekt erreicht wurde. Im naechten Debug lauf setzt man dann mehr breakpoints .....
Das ist wahrscheinlich im Kernel (oder ggf einel dll). Kann aber auch sein, das es im "nirgendwo" ist.
Wenn die CriticalSection ueber das Betriebsystem verwaltet wird, dann ist die 2te freigabe ein Aufruf ans OS mit illegalen Werten, and stuerzt im Kernel ab, oder kann irgendwo in einen zufaelligen speicher umgeleited werden (wo dann random data, statt assembler ist).
In solch einem Falle ist zum Zeitpunkt des Fehlers hauefig auch der Stack unlesbar. Es gibt keine moeglichkeit vom Fehler den Quellkode zu finden.
Man kann dann nur viele breakpoints setzen, und sich merken welche als letzter korrekt erreicht wurde. Im naechten Debug lauf setzt man dann mehr breakpoints .....