Forum: PC-Programmierung fpc/Lazarus: Daemon access violation bei kill/Strg+C


von Von K. (klausewitz)


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

von Von K. (klausewitz)


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

von Von K. (klausewitz)


Lesenswert?

Hat sich erledigt, Lösung selbst gefunden.

von Nur_ein_Typ (Gast)


Lesenswert?

Von K. schrieb:
> Hat sich erledigt, Lösung selbst gefunden.

Vielen Dank, daß Du anderen Deine Lösung mitteilst, wenn sie zukünftig 
nach einem ähnlichen Problem suchen... nicht. rolleyes

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.