external Sigsegv-Fehler beim Beenden des Programms

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
karkov
Beiträge: 69
Registriert: Di 27. Okt 2009, 17:52

external Sigsegv-Fehler beim Beenden des Programms

Beitrag von karkov »

Liebes Forum,

Ich habe ein 64-Bit-System mit einer 32-Bit installation von Lazarus (in der 64-Bit-Version klappte Lazreport nicht, da wurden mit einem mal Fehler produziert, die vorher gar nicht auftauchten)
ich habe ein Programm, dass auch mehreren Forms und den dazugehörigen Units besteht. Bisher hat eigentlich immer alles gut funktioniert, seit neuestem habe ich aber einen seltsamen external Sigsegv-Fehler, sobald ich das Programm schließe. Der Fehler dritt erst auf, wenn ich von meinem Haupt-Fromular aus ein weiteres öffnen will. Ich habe einmal versucht herauszufinden, wo der Fehler erzeugt wird, ich hoffe, dass hilft weiter.
In der Datei win32callback.inc tritt der Fehler in Zeile 100 auf:
Result := Windows.CallWindowProcW(PrevWndProc, Window, Msg, WParam, LParam)

Liegt der Fehler ev. da ran, dass ich die 32-Bit-Version auf einem 64-er System verwende? Wenn ja, gibt es Möglochkeiten, dass zu umgehen?

Vielen Dank im Voraus,

Karkov

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: external Sigsegv-Fehler beim Beenden des Programms

Beitrag von wp_xyz »

karkov hat geschrieben:Liegt der Fehler ev. da ran, dass ich die 32-Bit-Version auf einem 64-er System verwende?

Mit Sicherheit nicht, so arbeite ich laufend. Ich vermute eher, dass es da irgendein Speicherproblem, Überlauf, Überschreiben o.ä. gibt. Aktiviere zuerst mal alle Häkchen unter Projekt-Optionen / Compilereinstellungen / Debuggen / Überprüfungen. Aktiviere auch "HeapTrc-Unit verwenden etwas weiter unten. Vielleicht bekommst du durch die nun abgesetzten zusätzlichen Meldungen eine Idee wo das Speicherproblem herkommt.

karkov
Beiträge: 69
Registriert: Di 27. Okt 2009, 17:52

Re: external Sigsegv-Fehler beim Beenden des Programms

Beitrag von karkov »

Hallo wp_xyz,

das sind ja erst ein mal potentiell gute Nachrichten. Mit der Debug-Option laufe ich bereits beim Show-Ereignis in einen Fehler. Also, es ffnet sich das Hauptfenster. Dann will ich ein anderes Fenster öffnen lassen und ich bekomme einen Sigsegv-Fehler und zwar iin der Prozedure:
TControl.SetVisible(Value : Boolean) der control.inc in der letzten Zeile der Prozedur bei:
ControlState := ControlState + [csVisibleSetInLoading];

Weißt Du, wodurch das hervorgerufen sein kann?

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

Re: external Sigsegv-Fehler beim Beenden des Programms

Beitrag von Warf »

Die Fehlermeldung "External SIGSEGV" steht für Signal Segmentation Violation, dies bedeutet, das du auf einen gesperrten Speicherbereich (Speicher der nicht alloziiert wurde, und daher in der Memory Table des Betriebsystems nicht eingespeichert ist) zugreifst. Dies kommt für gewöhnlich vor wenn:
1. Versucht wird ein Nil Zeiger zu dereferenzieren, z.B. ein nicht Initialisiertes Objekt zu verwenden, Bsp:

Code: Alles auswählen

var sl: TStringlist;
begin
  sl.Add('Test'); // SL nicht erstellt, daher SIGSEGV

2. Versucht wird einen ungültigen Zeiger zu dereferenzieren, z.B. wenn man versucht auf ein bereits ge-free'tes Objekt zuzugreifen, Bsp:

Code: Alles auswählen

sl.Free;
sl.Add('Test'); // SIGSEGV da sl vorher gelöscht wurde


Die zweite Möglichkeit kann vor allem vorkommen, wenn man ausversehen den Zeiger überschreibt, sowas kann sehr schnell passieren wenn man Arraygrenzen überschreitet. Wenn man z.B. versucht in das 5te element eines 4 Elementen Arrays etwas rein zu schreiben, so überschreibt man den Speicherbereich hinter dem array, der eventuell bereits schon einer anderen Variable zugeordnet ist, und schon hat man den Salat. Da ich deinen Code nicht kenne, dein Fehler allerdings LCL intern bei einer Control Klasse Auftritt, denke ich es könnte zwei Fehlerherde geben, 1. Du Free'st das Formular/Control bevor diese Methode durchgelaufen ist (hast du zufällig irgendwo ein .Free der entsprechenden Variable stehen?), oder, das ist aber schon etwas sehr weit hergeholtes, du könntest mit einem Array den This Zeiger des Methodenaufrufs überschreiben, weshalb der Zugriff auf die eigenen Elemente nicht mehr möglich ist.

Zunächst kannst du in den Projekteinstellungen unter Debugging den haken bei Range-Checks setzen, wenn das keine Fehler wirft hast du wohl an irgend einer Stelle zu früh ein Objekt mittels Free (oder Destroy) gelöscht.

Da ich allerdings keine Einzelheiten zu deinem Programmtext kenne kann ich auch nur ins Blaue raten

Antworten