External SIGSEGV, Bei Adresse...

Für Fragen rund um die Ide und zum Debugger
Antworten
harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

External SIGSEGV, Bei Adresse...

Beitrag von harrybonn »

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?

Socke
Lazarusforum e. V.
Beiträge: 3158
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...

Beitrag von Socke »

harrybonn hat geschrieben:Dennoch die Frage: Wie kann mir Lazarus helfen, mit Bordmitteln diesen Fehler zu finden?

Bei Objekten kannst du die folgendes machen:
  1. nach jeder Freigabe (Destroy oder Free) alle Objektreferenzen auf nil setzen (oder FreeAndNil verwenden)
  2. Compiler-Option -CR setzen
Dann erhältst du beim Aufruf einer virtuellen Methode eines bereits freigegebenen Objekts den Runtime-Fehler 210

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

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

Re: External SIGSEGV, Bei Adresse...

Beitrag von Warf »

harrybonn hat geschrieben:Dennoch die Frage: Wie kann mir Lazarus helfen, mit Bordmitteln diesen Fehler zu finden?


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 reduzieren

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: External SIGSEGV, Bei Adresse...

Beitrag von martin_frb »

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 .....

Antworten