[Gelöst] Sigsegv Error bei delay Aufruf

Für Fragen von Einsteigern und Programmieranfängern...
Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Beim Comilieren kommt übrigens kurz eine Warnung:

link.res contains output sections did you forget -T

Unter

https://www.freepascal.org/faq.var#unix-ld219

steht

"Their is no way to remove the -T warning with earlier FPC versions, but it should not result in any problems." Keine Ahnung, ob das eine Bedeutung hat.

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Irgendwie greifst du auf Form2 zu, obwohl noch kein Speicher dafür reserviert wurde.
Sieht irgendwie nach einem fehlendem Create aus.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
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: Sigsegv Error bei delay Aufruf

Beitrag von fliegermichl »

Mathias hat geschrieben: Mi 15. Jul 2020, 16:47 Irgendwie greifst du auf Form2 zu, obwohl noch kein Speicher dafür reserviert wurde.
Sieht irgendwie nach einem fehlendem Create aus.
Create ist noch zu früh. Die Formulardaten werden später erst aus den Resourcen geladen.
Probier mal folgendes:

Code: Alles auswählen

TConfig = class ( TForm )
 ...
 public
  isLoaded : boolean;
  constructor Create(aOwner : TComponent);
  procedure   Loaded; override;
 end;
 
 var config : TConfig;
 
 implementation
 constructor TConfig.Create(aOwner : TComponent);
 begin
  isLoaded := False;
  ...
 end;
 
 procedure TConfig.Loaded;
 begin
  inherited;
  isLoaded := True;
 end;
 
Bevor du nun auf die Elemente von TConfig zugreifst, prüfst du ob Config.isLoaded true ist.

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Create ist noch zu früh. Die Formulardaten werden später erst aus den Resourcen geladen.
Probier mal folgendes:

Code: Alles auswählen

TConfig = class ( TForm )
 ...
 public
  isLoaded : boolean;
  constructor Create(aOwner : TComponent);
  procedure   Loaded; override;
 end;
 
 var config : TConfig;
 
 implementation
 constructor TConfig.Create(aOwner : TComponent);
 begin
  isLoaded := False;
  ...
 end;
 
 procedure TConfig.Loaded;
 begin
  inherited;
  isLoaded := True;
 end;
 
Bevor du nun auf die Elemente von TConfig zugreifst, prüfst du ob Config.isLoaded true ist.
Jetzt kommt schon bei dem Aufruf

Code: Alles auswählen

if config.isLoaded // <- hier SIGSEGV Fehler
   then delay (Config.SpinEdit1.Value)
   else delay (200)
der SIGSEGV Fehler.

Selbst wenn ich in dem GPIOUnit alles auskommentiere und in uses Unix und BaseUnix entferne, kommt noch der Fehler.

Ich habe das Ganze jetzt mal vorläufig anders gelöst. IM GPIO Unit bei den delays nur Konstanten (kein Problem, da sich das dort wohl eh nicht ändern wird.) Im OnActivate und OnChange verzichte ich auf den Zugriff auf Komponenten der Config Form. Alle anderen Zugriffe auf die Config Form sind jetzt möglich, auch nach dem das Programm ein paar Zeilen gewachsen ist. Hoffe nur, dass mir das nicht später erneut um die Ohren fliegt. Das delay (Config.SpinEdit1.Value) kann ich jetzt auch selstamerweise ohne Fehler von einem anderen Unit aus aufrufen.

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Code: Alles auswählen

if Assign(config) then delay(config...) else delay(200)
Das könnte weiter helfen.
Das isLoad kann dann weg.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Mathias hat geschrieben: Do 16. Jul 2020, 17:13

Code: Alles auswählen

if Assign(config) then delay(config...) else delay(200)
Das könnte weiter helfen.
Das isLoad kann dann weg.
Da kommt beim Comilieren bei Assign die Meldung "Wrong number of paramters"

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Code: Alles auswählen

if config = nil then .....
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Über das config = NIL geht er jetzt drüber und stürzt im then Zweig beim delay ab.

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Code: Alles auswählen

if config <> nil

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Dann geht er in den else Zweig und macht das delay (200).

Das Problem ist wohl, dass bei einem Form1.OnActivate die Resourcen der Form2 noch nicht z.V. stehen. Auch bei einem Form1.OnPaint geht es noch nicht.

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Das wolltest du doch, solange config noch nicht erzeugt ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Ok, jetzt habe ich erst verstanden was Ihr meint. So kann ich das zumindest abfangen. Ist also einfach bei Lazarus so, dass die Resourcen von Form2 bei einem Form1 OnAcivate, OnDraw, OnChange etc. noch nicht initialisiert sind, sondern erst wenn ich auf einen Button klicke.

Vielen Dank für Eure Hilfe und Eure Mühe.

Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Du hast immer noch etwas nicht ganz verstanden.

Wen da mal dein ganzes Projekt in einer Zip hochlädst, entdecken wir vielleicht die Hauptursache deines Übels.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Mathias hat geschrieben: Do 16. Jul 2020, 19:33 Du hast immer noch etwas nicht ganz verstanden.

Wen da mal dein ganzes Projekt in einer Zip hochlädst, entdecken wir vielleicht die Hauptursache deines Übels.
Ja, in der Tat. Das Programm funktioniert jetzt zwar korrekt mit allen Funktionen, aber unter der Haube macht es vollkommen verrückte Sachen. Ich habe z.B. mehrere Toggleboxen mit einem OnClick Event. Sollte also nur auslösen, wenn ich mit der Maus klicke. Jetzt stelle ich gerade fest, dass auch alle OnKlick Events automatisch ausgelöst werden, bevor die Dinge in der FormAvtivate Routine ausgeführt wurden.

Das führt dazu, dass das Programm versucht Relais zu schalten, die noch nicht initialisiert sind. Ist zwar kein Problem, da irgendwann die FormActivate Routine doch Ihren Dienst verrichtet und die Relais sauber auf die Ausgangswerte setzt, sobald die Form angezeigt wird. Der Fehler ist auf Benutzerebene zwar nicht sichtbar, aber dennoch chotisch.

Jetzt raucht mir der Kopf. Ich werde Morgen das Projekt einmal in einer ZIP hochladen.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Sigsegv Error bei delay Aufruf

Beitrag von Winni »

Hi!

Vorsicht mit onActivate:

Je nach Betriebssystem wird das verschieden ausgeführt.

Linux macht das nur ein einziges Mal.
Windows macht das jedesmal wenn sich zB der Zustand von WSminimized zu einem anderen ändert.

Winni

Antworten