Exception und Programm hängt - aber wo?

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1144
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Exception und Programm hängt - aber wo?

Beitrag von Timm Thaler »

Ich habe auf dem Raspi ein Programm, welches Kamerabilder von einer IP Cam abruft und als Zeitraffer zusammenstellt. Das Programm hängt immer mal und muss dann per Ctrl-C beendet werden.

Nun habe ich es unter Laz 2.0.1 und FPC 3.2.0 mit Debugger laufen. Das Programm hängt wieder, aber es kommt keine Fehlermeldung. Wenn ich es stoppe und Einzelschritt mache, zeigt mir die Assembler-Ansicht, dass ein Befehl 00010C60 000000ef svc 0x00000000 ausgeführt wird, offenbar eine Exception - und das Programm hängt wieder, ich stoppe es, mache Einzelschritt, es steht wieder exakt an der gleichen Stelle. Laut Assembler passiert das in SYSTEM_$$_FPSYSCALL$crc26E42702.

Da der Fehler selten und sporadisch auftritt, lasse ich das Programm jetzt mal so stehen und hoffe, ihr könnt mir sagen wie ich rausbekomme, was den Fehler verursacht und wie ich rausbekomme wo der Fehler verursacht wird.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4370
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Exception und Programm hängt - aber wo?

Beitrag von af0815 »

Schon mal den Stacktrace angeschaut, da solltest du die Aufruhierachie sehen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Timm Thaler
Beiträge: 1144
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Exception und Programm hängt - aber wo?

Beitrag von Timm Thaler »

Habs jetzt, das sieht so aus:

Code: Alles auswählen

#0 SYSTEM_$$_FPSYSCALL$crc26E42702 at :0
#1 SOCKETS_$$_FPRECV$LONGINT$POINTER$LONGWORD$LONGINT$$LONGINT at :0
#2 SSOCKETS$_$TSOCKETHANDLER_$__$$_RECV$formal$LONGINT$$LONGINT at :0
#3 SSOCKETS$_$TSOCKETSTREAM_$__$$_READ$formal$LONGINT$$LONGINT at :0
#4 FPHTTPCLIENT$_$TFPCUSTOMHTTPCLIENT_$_READRESPONSE$TSTREAM$array_of_LONGINT$BOOLEAN$$BOOLEAN_$$_TRANSFER$crc6B70A58D at :0
#5 FPHTTPCLIENT$_$TFPCUSTOMHTTPCLIENT_$__$$_READRESPONSE$TSTREAM$array_of_LONGINT$BOOLEAN$$BOOLEAN at :0
#6 FPHTTPCLIENT$_$TFPCUSTOMHTTPCLIENT_$__$$_DONORMALREQUEST$crcA46C7035 at :0
#7 FPHTTPCLIENT$_$TFPCUSTOMHTTPCLIENT_$__$$_DOMETHOD$ANSISTRING$ANSISTRING$TSTREAM$array_of_LONGINT at :0
#8 FPHTTPCLIENT$_$TFPCUSTOMHTTPCLIENT_$__$$_HTTPMETHOD$ANSISTRING$ANSISTRING$TSTREAM$array_of_LONGINT at :0
#9 GETIMAGEDATA({UHOST = 0x76e0811c '...


Aber wieso kommt das Programm aus dem Aufruf nicht mehr raus?

Die aufrufende Routine sieht so aus:

Code: Alles auswählen

function GetImageData(var acam : Twebcam; var aauth : Tauth; const data : TMemoryStream) : integer;
var
  hcli : TFPHTTPClient;
begin
  GetImageData := 0;
  hcli := TFPHTTPClient.Create(nil);
  try
    try
      hcli.AddHeader('User-Agent','Mozilla/5.0 (compatible; fpweb)');
      if aauth.nonce <> '' then begin  // prüfen ob bereits Parameter für Auth von Kamera erhalten
        hcli.AddHeader('Authorization', GetAuthString(acam, aauth));
      end;
      data.Clear;
      hcli.HTTPMethod('GET', acam.uhost + acam.upath, data, [200, 400, 401, 403, 404]);
      if hcli.ResponseStatusCode = 401 then begin  // wenn Auth gefordert
        SetAuthData(aauth, hcli.ResponseHeaders.Values['www-authenticate']);
      end;
      data.Position := 0// Stream auf Anfang
      GetImageData := hcli.ResponseStatusCode;
    except
      on E: Exception do begin
        if acam.error <> ehttp then begin
          log.message('Fehler bei Verbindung: ' + E.Message);
          acam.error := ehttp;  // Fehler http merken
        end;
      end;
    end;
  finally
    hcli.Free;
  end;
end;       


Da wird also versucht, ein Bild zu laden, wenn noch nicht authentifiziert, wird die Auth gesendet, ansonsten das Bild in den Speicher geladen. Bei Fehlern sollte eine Fehlermeldung kommen. Das funktioniert soweit auch, wenn die Kamera immer mal nicht erreichbar ist. Aber manchmal bleibt das Programm hängen und es hilft nur ein Kill.

pluto
Lazarusforum e. V.
Beiträge: 7097
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Exception und Programm hängt - aber wo?

Beitrag von pluto »

ich würde mal in dieser Procedure überall ein writeln machen damit du siehst, bei welcher Zeile das Problem auftritt.

Was ist wenn hcli.ResponseHeaders.Values['www-authenticate'] fehlschlägt?
MFG
Michael Springwald

Antworten