Exception abfangen und Fortsetzen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Exception abfangen und Fortsetzen

Beitrag von HK12 »

Hi,
ich habe ein Problem. Irgendwie schaffe ich es nicht eine Exception abzufangen die in einer lib/DLL passiert. Kurz zu meinem Programm.
Ich habe mehrere Threads in denen per Synapse Mails versendet werden. Nun passiert es ab und zu mal das OpenSSL (das brauche ich für TLS und DKIM) "abschmiert". Leider bricht dann das ganze Programm ab. Das Programm ist ein Unix CustApp. Also ein Konsolen Programm und läuft unter Debian.

Was ich schon versucht habe:
1. habe ich alles mit try/except abgesichert. Leider bringt das nichts.
2. Ich habe HandleException auf meine Routine umgebogen weil ich dachte das ich es dort mitbekomme. Leider nicht.

Was klappt ist, wenn innerhalb des Programms eine nicht behandelte exception kommt. Dann springt er in meine Routine.
Die Threads erzeuge ich mit BeginThread.

Ich suche nun schon mind. 2 Wochen nach einer Lösung. Leider finde ich nichts dazu. Leider ist der Fehler nicht reproduzierbar. Mal läuft es 4 Tage durch, mal schmiert es nach 1 Stunde ab.

Nun zu meinen Fragen:
Wie kann ich eine "externe" exception abfangen?
Ist es irgendwie möglich das man nach einer exception einfach nur den Thread killt und alles andere läuft weiter?

Vielen dank im Voraus
PS.: Das bekomme ich zurück wenn es unter gdb läuft.

Code: Alles auswählen

Thread 5 "newsletter" received signal SIGPIPE, Broken pipe.
[Switching to Thread 0x7ffff6dc8700 (LWP 2906)]
__libc_write (nbytes=35, buf=0x7fffe00f4c43, fd=5) at ../sysdeps/unix/sysv/linux/write.c:26
26             return SYSCALL_CANCEL (write, fd, buf, nbytes);

PascalDragon
Beiträge: 179
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Exception abfangen und Fortsetzen

Beitrag von PascalDragon »

FPC fängt nur die folgenden POSIX Signale ab: SIGFPE, SIGSEGV, SIGBUS und SIGILL. Diese werden dann entsprechend zu Laufzeitfehlern bzw. Exceptions umgewandelt. SIGPIPE wird nicht abgefangen, also musst du dir selbst einen entsprechenden Signalhandler einstellen. Beschäftige dich dazu am Besten mit der Linux Funktion SigAction (in FPC als FpSigAction verfügbar).
FPC Compiler Entwickler

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 728
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Exception abfangen und Fortsetzen

Beitrag von fliegermichl »

Ich hatte auch schon mal, daß in einer Bibliothek stumpf ein Aufruf von "halt" drinstand. Da hat die Anwendung keine Chance irgendwas abzufangen.

HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Exception abfangen und Fortsetzen

Beitrag von HK12 »

Hi,
erstmal danke für Antworten. Also in jedem Thread dieses Handling einbauen, und dann müsste ich das mitbekommen obwohl es in OpenSSL passiert?

Quasi wir hier erklärt. https://www.freepascal.org/docs-html/rt ... ignal.html

PascalDragon
Beiträge: 179
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Exception abfangen und Fortsetzen

Beitrag von PascalDragon »

Die Signalbehandlung ist global und nicht threadspezifisch, wenn ich mich richtig erinnere, also sollte es reichen, wenn du das einmal zu Beginn deines Programm machst.

Und du solltest wie gesagt FpSigAction anstelle von FpSignal verwenden.
FPC Compiler Entwickler

HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Exception abfangen und Fortsetzen

Beitrag von HK12 »

Danke, ich werde es mal versuchen. Problem ist nur das der Fehler nicht reproduzierbar ist. Also muss ich das einbauen und warten. :(

sstvmaster
Beiträge: 394
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.0.10
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Exception abfangen und Fortsetzen

Beitrag von sstvmaster »

Lies dir auch das mal durch was hier Diskutiert worden ist. https://mta.openssl.org/pipermail/opens ... 05767.html

Hattest du den Beitrag auch verfasst? https://www.delphipraxis.net/1479685-post1.html

Denn laut dieser Fehlermeldung kommt der SIGPIPE aus dem SSL_Write, wie im ersten Link.
Windows 10, Lazarus 2.0.10 + Lazarus Trunk
LG Maik

HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Exception abfangen und Fortsetzen

Beitrag von HK12 »

Hi,
ja der ist auch von mir. Aber dort wird mehr mit Delphi/Windows gearbeitet. Dort hat man mir bei Delphisachen immer gut geholfen.
Da dachte ich, da ich hier schon lange angemeldet bin, ich frage hier mal nach. Was mir ebenfalls geholfen hat. Das mit dem Signalhandling war mir neu.

Für diese Hilfe möchte ich mich herzlich bedanken. Ich hoffe ihr nehmt keinen Anstoß daran das ich in 2 Foren gefragt habe. Das ist eigentlich nicht meine art. Aber da ich schon lange an diesem Fehler suche habe ich ebenfalls hier mal nachgefragt und den tipp von PascalDragon bekommen.

PascalDragon
Beiträge: 179
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Exception abfangen und Fortsetzen

Beitrag von PascalDragon »

In der OpenSSL-Users Diskussion, die sstvmaster verlinkt hat, ist dieser Beitrag interessant. Du solltest also einfach beim Start deines Programms FpSigAction(SIGPIPE, SIG_IGN, Nil) machen können.
FPC Compiler Entwickler

HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Exception abfangen und Fortsetzen

Beitrag von HK12 »

Wenn das klappt, dann ist das die Lösung. Das werde ich sofort probieren. Allerdings weiß ich nicht wann ich eine Rückmeldung geben kann da das Programm manchmal 1 Tag bzw. bis zu 4 Tage läuft ehe der Fehler kommt.

Vielen dank

HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Exception abfangen und Fortsetzen

Beitrag von HK12 »

PascalDragon hat geschrieben:
Mi 30. Dez 2020, 11:32
FpSigAction(SIGPIPE, SIG_IGN, Nil)
Leider geht das so nicht. Da bekomme ich

Code: Alles auswählen

newsletter.ppr(177,32) Error: Incompatible type for arg no. 2: Got "ShortInt", expected "psigactionrec"
Ich habe das nun so gemacht.

Code: Alles auswählen

    new(DoSigHnd);
    DoSigHnd^.sa_Handler:=SigActionHandler(@DoSig);
    fillchar(DoSigHnd^.Sa_Mask,sizeof(DoSigHnd^.sa_mask),#0);
    DoSigHnd^.Sa_Flags:=0;
    DoSigHnd^.sa_restorer:=nil;
    FPSigaction(SIGPIPE,DoSigHnd,nil);
Im DoSig ist nur ein WriteLn(sig) (wie im beispiel). Ich hoffe das klappt. Oder sollte dort auch ein nil rein?

PascalDragon
Beiträge: 179
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Exception abfangen und Fortsetzen

Beitrag von PascalDragon »

Grad nochmal nachgelesen. Du musst einfach den sa_handler des records auf SIG_IGN setzen. Also folgendermaßen (das New ist übrigens unnötig solange du eine globale Variable nutzt):

Code: Alles auswählen

var
  DoSigHnd: sigactionrec;
begin
  DoSigHnd := Default(sigactionrec);
  // einfach rumcasten, der Kernel macht das dann korrekt
  DoSigHnd.sa_handler := sigactionhandler_t(SIG_IGN);
  FPSigAction(SIGPIPE, @DoSigHnd, Nil);
  // ...
end.
FPC Compiler Entwickler

HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Exception abfangen und Fortsetzen

Beitrag von HK12 »

Danke dir. Ich werde es ändern. Obwohl das andere auch läuft. Ich schreibe mir dort ein kleines Log damit ich sehe das er da durch gekommen ist.

Das Programm läuft nun seit 3 Stunden. Mal abwarten..... Ich finde das ist das schlimmste was es gibt, wenn man einen Fehler nicht Reproduzieren kann.

Nochmal danke!

HK12
Beiträge: 10
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Exception abfangen und Fortsetzen

Beitrag von HK12 »

Wie versprochen hier die Rückmeldung:
Es klappt. Der SigPipe wird abgefangen und der Thread läuft weiter. Der Fehler ist am 03.01.2021 aufgetreten.

Vielen dank nochmal.

Antworten