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
external Sigsegv-Fehler beim Beenden des Programms
Re: external Sigsegv-Fehler beim Beenden des Programms
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 hat geschrieben:Liegt der Fehler ev. da ran, dass ich die 32-Bit-Version auf einem 64-er System verwende?
Re: external Sigsegv-Fehler beim Beenden des Programms
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?
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?
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: external Sigsegv-Fehler beim Beenden des Programms
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:
2. Versucht wird einen ungültigen Zeiger zu dereferenzieren, z.B. wenn man versucht auf ein bereits ge-free'tes Objekt zuzugreifen, Bsp:
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
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
Code: Alles auswählen
sl.Free;
sl.Add('Test'); // SIGSEGV da sl vorher gelöscht wurde
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