fpc/Lazarus: Daemon access violation bei kill/Strg+C

OP #6928345
Lesenswert?
• ▲
▼
Hallo zusammen,
ich versaure momentan vor einem Problem und erhoffe mir einen kleinen 
Denkanstoß... ;)
Habe meinen ersten Daemon in fpc geschrieben. Läuft auch soweit prima. 
Nur das Beenden ist ein Graus:
1
./daemon -r     => Strg+C
2
./daemon -r &   => $bash: kill pid
führt beides zu einer Access-Violation. Ich finde nur nicht raus wo 
genau.
Beim Erstelles des Daemons habe ich mich am PDF "Taming the daemon" von 
https://wiki.lazarus.freepascal.org/Daemons_and_Services orientiert.

Mein Hauptprogramm sieht so aus:
1
{$DEFINE UseCThreads}
2
uses
3
  {$IFDEF UNIX}{$IFDEF UseCThreads}
4
  cthreads,
5
  {$ENDIF}{$ENDIF}
6
  daemonapp,
7
  MeterData, ConfigFiles,
8
  SolarLogDaemonMappers, SolarLogDaemons, DaemonThreads;
9
begin
10
  RegisterDaemonClass(TSolarLogDaemon);
11
  RegisterDaemonMapper(TSolarLogDaemonMapper);
12
  Application.Title:='Solar Logger Daemon';
13
  Application.Run;
14
end.
MeterData und ConfigFiles sind nur Datenhaltung für meinen Thread.
1
TSolarLogDaemonMapper = class(TCustomDaemonMapper)
2
    constructor Create(AOwner: TComponent); override;
3
  end;
4
constructor TSolarLogDaemonMapper.Create(AOwner: TComponent);
5
var d : TDaemonDef;
6
begin
7
  inherited Create(AOwner);
8
  d:=DaemonDefs.Add as TDaemonDef;
9
  d.DisplayName:='solarlog daemon';
10
  d.Name:='SolarLogDaemon';
11
  d.DaemonClassName:='TSolarLogDaemon';
12
  d.WinBindings.ServiceType:=stWin32;
13
end;
1
type
2
  TSolarLogDaemon = class(TCustomDaemon)
3
  protected
4
    fThread : TDaemonThread;
5
    procedure ThreadStopped(sender: TObject);
6
  public
7
    function Start : Boolean; override;
8
    function Stop : Boolean; override;
9
    function Pause : Boolean; override;
10
    function Continue : Boolean; override;
11
    function Execute : Boolean; override;
12
    function ShutDown : Boolean; override;
13
    function Install : Boolean; override;
14
    function Uninstall: boolean; override;
15
  end;
Das ganze ist jetzt so weit abgespeckt, daß alle Funktionen von 
TSolarLogDaemon nur noch true zurückgeben und kein eigener Thread mehr 
erzeugt wird. Ändert aber nichts an der access violation.

Habe TSolarLogDaemon schon mal einen destructor gegeben und dort mit 
writeln eine Ausgabe gemacht. Interessanterweise kommt auf der Konsole 
dann erst die access violation und dann die Ausgabe. Scheint also 
zumindest ein Thread noch weiterzulaufen?
Es spielt anscheinend keine Rolle, ob ich auf dem Raspberry oder dem 
Linux-PC unterwegs bin.

Kennt jemand das Phänomen oder sieht spontan, wo ich mich 
verprogrammiert habe?

FPC Version 3.0.0
Lazarus 1.6

Danke schon mal!
VG Klausewitz
OP #6928357
Lesenswert?
• ▲
▼
kleiner Nachtrag.
Habe svcdebug definiert. Nach Abbruch auf der Konsole kommt das: 
(DEBUG-kompiliert)
1
^CException at 000000000042A84E: EAccessViolation:
2
Access violation.
3
Heap dump by heaptrc unit
4
172 memory blocks allocated : 12724/13192
5
172 memory blocks freed     : 12724/13192
6
0 unfreed memory blocks : 0
7
True heap size : 131072
8
True free heap : 131072
Im syslog sieht es so aus:
1
solarlogd: [Info] Daemon solarlog daemon current status: Start Pending
2
solarlogd: [Info] Daemon Start Ok
3
solarlogd: [Info] Daemon solarlog daemon current status: Running
4
solarlogd: [Info] Daemon execute: Ok
5
solarlogd: [Error] Access violation

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.