Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler bei der Bereichsprüfung (https://www.delphipraxis.net/200096-fehler-bei-der-bereichspruefung.html)

Rainer Wolff 19. Mär 2019 14:54

Delphi-Version: 10.2 Tokyo

Fehler bei der Bereichsprüfung
 
Hallo, wer kann mir vielleicht noch Tipps zur Fehlersuche geben:

Ich habe die Bereichsprüfung (Range Checking) im Projekt aktiviert. Die sollte ja anschlagen, wenn ich irgendwelche Arraygrenzen verletze, soweit klar.
Meine Anwendung kommuniziert ständig (mittels einer C-dll) mit einer Steuerung. Wenn ich die Netzwerkverbindung unterbreche, erhalte ich diesen netten Fehler bei der Bereichsprüfung.
Blos, da wo der Debugger stehen bleibt, ist nix von einem Array zu sehen. An der Stelle wird eine Fehlermeldung in eine Logdatei geschrieben, dazu ein Fehlercode ueber ein Dictionary in einen Text konvertiert.
Die Konvertierung mit Dictionary habe ich schon komplett rausgenommen (result:=''), Fehler kommt trotzdem.

Die Fehlermeldung wird bereits beim hineinsteppen (F7) in die Funktion ausgelöst, also keine Moeglichkeit, da noch etwas genauer zu debuggen.

Wie kann ich den Fehler eingrenzen?

hoika 19. Mär 2019 16:01

AW: Fehler bei der Bereichsprüfung
 
Hallo,
dann kann es ein Übergabe-Parameter der Funktion sein.
Wie sieht denn der Aufruf Deiner Funktion aus?
RangeCheck kann auch durch Strings hervorgerufen werden.

S,S1: String;
S:= '123';
S1:= S[10]; -> Puff

Hier hilft vielleicht auch MadExcept etwas.

Rainer Wolff 20. Mär 2019 13:16

AW: Fehler bei der Bereichsprüfung
 
Hier der Funktionsaufruf:

Hier die Zeilen, in denen der Range-Error zuschlägt

Code:
   
  if ConnectionState<>UA_STATUSCODE_GOOD then
    log(llError,format('UA_Client_connect failed ConnectionState %s',[GetHResultString(ConnectionState)]))
  else
    log(llBlack,format('UA_Client_connect connected ConnectionState %s',[GetHResultString(ConnectionState)]));
  if statuscode<>UA_STATUSCODE_GOOD then
    log(llError,format('UA_Client_run_iterate failed Statuscode %s',[GetHResultString(statuscode)]))
Code:
function TOpcUAServer.GetHResultString(HR: HResult): String;
begin
  result:='$'+IntToHex(hr);
  if Statuscodelist.ContainsKey(result) then
    result:=Statuscodelist[result];
end;
Die Log-Funktion selber mit den selben Parametern wird im Erfolgsfall laufend aufgerufen.

Zum Umfeld: Ich benutze eine C-Dll, um aus Delphi mit einem OPCUA-Server zu kommunizieren. Timer-gesteuert wird laufend eine Dll-Funktion angestoßen, um die Kommunikation zu am Leben zu erhalten. Bekomme ich einen Kommunikationsfehler, schreibe ich die entsprechende Log-Meldung raus.

Geht mir nun die Kommunikation flöten (passiert laufend, während die zugehörige Steuerung programmiert wird, oder halt auch wenn ich das Netzwerkkabel ziehe), dann beglückt mich diese Bereichsprüfungsmeldung, die an der Anlage blöd aussieht.

Deaktiviere ich die Bereichsprüfung, läuft alles wunderbar, die Kommunikation setzt wieder auf.

hoika 20. Mär 2019 13:45

AW: Fehler bei der Bereichsprüfung
 
Hallo,
das hier könnte die Stelle sein

Statuscodelist[result];

Hier hilft erst mal ein beherztes try except um den ganzen Code.

Aber ich würde die Ursache finden.

Rainer Wolff 20. Mär 2019 14:18

AW: Fehler bei der Bereichsprüfung
 
auch das hier
Code:
function TOpcUAServer.GetHResultString(HR: HResult): String;
begin
  result:='schei...';
//  result:='$'+IntToHex(hr);
//  if Statuscodelist.ContainsKey(result) then
//    result:=Statuscodelist[result];
end;
bringt einen Fehler bei der Bereichsprüfung, kann also als Ursache ausgeschlossen werden.

Uwe Raabe 20. Mär 2019 14:19

AW: Fehler bei der Bereichsprüfung
 
Wie ist denn ConnectionState deklariert?

hoika 20. Mär 2019 14:31

AW: Fehler bei der Bereichsprüfung
 
Hallo,
Zitat:

Hier die Zeilen, in denen der Range-Error zuschlägt
Wo denn genau? Welche der 3 Logs ist es?
Was passiert, wenn du nicht mitloggst, also die Zeilen mal komplett ausklammerst.

Es könnte auch sein, dass intern Speicher zerschossen wird -> FastMM4.
Vielleicht zerschießt ja die Dll den Speicher.

freimatz 20. Mär 2019 14:33

AW: Fehler bei der Bereichsprüfung
 
... und wenn die Zeilen mehr als eine Funktion oder Anweisung enthalten aufteilen!

Rainer Wolff 20. Mär 2019 14:56

AW: Fehler bei der Bereichsprüfung
 
Uwe bekommt den Hauptpreis.

Connectionstate/Statuscode sind UInt32, HRESULT ist ein Longint

Delphi.Narium 20. Mär 2019 14:57

AW: Fehler bei der Bereichsprüfung
 
Dann wäre mal zu prüfen, ob diese Werte
Delphi-Quellcode:
ConnectionState und statuscode
zu HResult passen.

Eventuell tritt der Fehler ja nicht in
Delphi-Quellcode:
GetHResultString
auf, sondern Werte für den Parameter
Delphi-Quellcode:
HR: HResult
befinden sich außerhalb des Gültigkeitsbereiches von HResult.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz