AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi EAccessViolation führt zu unerwartetem APPCRASH (gelöst)

EAccessViolation führt zu unerwartetem APPCRASH (gelöst)

Ein Thema von mjustin · begonnen am 23. Mai 2018 · letzter Beitrag vom 23. Mai 2018
Antwort Antwort
Seite 1 von 3  1 23   
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#1

EAccessViolation führt zu unerwartetem APPCRASH (gelöst)

  Alt 23. Mai 2018, 08:37
Hi,

für eine Konsolenanwendung die sich mit einem ActiveMQ Server verbindet und Nachrichten sendet habe ich versucht, bei einem temporären Ausfall des Servers (oder des Netzwerks) die Verbindung neu herzustellen und verwende dazu eine Schleife, die bei einer Exception verlassen und dann nach dem erneuten Verbindungsaufbau wieder gestartet wird.

Anstatt die Schleife zu verlassen kommt es aber immer zu einem APPCRASH sobald der Server gestoppt wird.

Hier erst einmal der Code für die Schleife mit der Exceptionbehandlung und der Code, der die Nachricht sendet:

Delphi-Quellcode:
procedure TProducerLoop.Run;
begin
  while True do
  begin
    Connect;

    while True do
    begin
      try
        ProduceOneMessage;
      except
        on E: Exception do
        begin
          Break; // ---------------- Die innere Schleife soll bei einer Exception verlassen (stattdessen APPCRASH)
        end;
      end;
    end;

    Disconnect;
  end;
end;

procedure TProducerLoop.ProduceOneMessage;
var
  Payload: string;
begin
  Payload := Format('id [%d]', [Sequence.Value]);

  try
    Logger.Info('Produce ...');
    Producer.Send(Queue, Payload);
    Logger.Info('Produced message: ' + Payload);
    Sequence.Increment;
    Sleep(100);
  except
    on E: Exception do
    begin
      Logger.Error('ProduceOneMessage', E);
      raise;
    end;
  end;
end;
Mit madExcept habe ich den Absturz untersucht und die Ursache ist anscheinend eine Access Violation. Im Stacktrace erscheint die Zeile 109 aus der ProducerLoop unit, dies ist die Zeile in der das "Break" steht mit dem die innere Schleife verlassen wird.

Code:
exception class  : EAccessViolation
exception message : Access violation at address 00404A74 in module 'Producer.exe'. Read of address 00000000.

main thread ($e3c):
00404a74 +170 Producer.exe System                 44  +0 @HandleOnException
00404b5e +02a Producer.exe System                 44  +0 @HandleFinallyInternal
777e3835 +0f4 ntdll.dll                                  RtlUnwind
777aed27 +063 ntdll.dll                                  bsearch
7779015e +00a ntdll.dll                                  KiUserExceptionDispatcher
0045b0cf +033 Producer.exe SysUtils                      AppendChars
0040461a +002 Producer.exe System                 44  +0 @ClassDestroy
0045d528 +03c Producer.exe SysUtils                      Exception.Destroy
00404198 +008 Producer.exe System                 44  +0 TObject.Free
004531c9 +009 Producer.exe madExcept                     InterceptFreeExceptObject
00404d0a +016 Producer.exe System                 44  +0 @DoneExcept
00482ebd +045 Producer.exe ProducerLoop          109 +12 TProducerLoop.Run
7779015e +00a ntdll.dll                                  KiUserExceptionDispatcher
777aed27 +063 ntdll.dll                                  bsearch
7779015e +00a ntdll.dll                                  KiUserExceptionDispatcher
00499cc9 +025 Producer.exe IdTCPConnection       814  +3 TIdTCPConnection.CheckForGracefulDisconnect
0049ed83 +05b Producer.exe BTCommAdapterBaseIndy 424  +9 TBTCommAdapterBaseIndy.ConsumeHeartBeats
0049ef09 +055 Producer.exe BTCommAdapterBaseIndy 516  +6 TBTCommAdapterBaseIndy.ReadStompHeader
0049f626 +02a Producer.exe BTCommAdapterIndy      66  +1 TBTCommAdapterIndy.ReadFrame
0049f189 +055 Producer.exe BTCommAdapterBaseIndy 574  +5 TBTCommAdapterBaseIndy.ReadOneMessage
00477dce +066 Producer.exe BTStompClient        1232  +6 TBTStompClient.WaitForReceiptFrame
00475ca0 +140 Producer.exe BTStompClient         681 +22 TBTStompClient.Send
0047a426 +09e Producer.exe BTAbstractTransport   191 +12 TBTAbstractTransport.InternalSend
0047a6b1 +029 Producer.exe BTAbstractTransport   242  +3 TBTAbstractTransport.Send
00481d0e +126 Producer.exe BTConnection         1460 +40 TBTSession.Send
0047bda4 +0bc Producer.exe BTMessageProducer     251 +27 TBTMessageProducer.Send
0047bc73 +027 Producer.exe BTMessageProducer     209  +1 TBTMessageProducer.Send
0047d35e +022 Producer.exe BTMQProducer          160  +2 TBTMQProducer.InternalSend
0047d202 +03e Producer.exe BTMQProducer          125  +3 TBTMQProducer.Send
00482f62 +086 Producer.exe ProducerLoop          126  +5 TProducerLoop.ProduceOneMessage
00482e9b +023 Producer.exe ProducerLoop          105  +8 TProducerLoop.Run
004831e7 +033 Producer.exe ProducerUnit           38  +5 RunDemo
004a0754 +020 Producer.exe Producer               15  +3 initialization
75a7343b +010 kernel32.dll                               BaseThreadInitThunk

Aus dem weiteren Stacktrace kann ich nicht erkennen warum die Schleife nicht verlassen wird.
Ich teste als nächstes ob das Break in einem try ... except den Absturz verursacht.
Die Entwicklungsumgebung ist Delphi 2009 auf Windows 7 (32 Bit).
Michael Justin

Geändert von mjustin (23. Mai 2018 um 11:29 Uhr) Grund: gelöst
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 08:44
Wäre da nicht ein Exit besser? Ich kann es mit den paar Source Krümeln leider nicht testen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#3

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 08:45
Update:

Am Break liegt es nicht, mit diesem Code ergibt sich beim Stoppen des Servers ebenfalls ein APPCRASH:

Delphi-Quellcode:
procedure TProducerLoop.Run;
begin
  while True do
  begin
    Connect;

    while IsConnected do
    begin
      try
        ProduceOneMessage;
      except
        on E: Exception do
        begin
          IsConnected := False; // ---------------- Die innere Schleife soll bei einer Exception verlassen (stattdessen APPCRASH)
        end;
      end;
    end;

    Disconnect;
  end;
end;
Im Stacktrace erscheint die Zeile 111 aus der ProducerLoop unit, dies ist die Zeile in der das IsConnected := False steht mit dem die innere Schleife verlassen wird.

Code:
exception class  : EAccessViolation
exception message : Access violation at address 00404A74 in module 'Producer.exe'. Read of address 00000000.

main thread ($b50):
00404a74 +170 Producer.exe  System                 72  +0 @HandleOnException
00404b5e +02a Producer.exe  System                 72  +0 @HandleFinallyInternal
77e83835 +0f4 ntdll.dll                                    RtlUnwind
77e4ed27 +063 ntdll.dll                                    bsearch
77e3015e +00a ntdll.dll                                    KiUserExceptionDispatcher
0045b0cf +033 Producer.exe  SysUtils                      AppendChars
7584c538 +041 KERNELBASE.dll                               RaiseException
0040461a +002 Producer.exe  System                 72  +0 @ClassDestroy
0045d528 +03c Producer.exe  SysUtils                      Exception.Destroy
00404198 +008 Producer.exe  System                 72  +0 TObject.Free
004531c9 +009 Producer.exe  madExcept                     InterceptFreeExceptObject
00404d0a +016 Producer.exe  System                 72  +0 @DoneExcept
00482ece +04e Producer.exe  ProducerLoop          111 +12 TProducerLoop.Run
77e3015e +00a ntdll.dll                                    KiUserExceptionDispatcher
77e4ed27 +063 ntdll.dll                                    bsearch
7584c538 +041 KERNELBASE.dll                               RaiseException
77e3015e +00a ntdll.dll                                    KiUserExceptionDispatcher
7584c538 +041 KERNELBASE.dll                               RaiseException
00491dee +016 Producer.exe  IdStack               894  +1 TIdStack.RaiseLastSocketError
00491d59 +015 Producer.exe  IdStack               868  +2 TIdStack.CheckForSocketError
0048df39 +025 Producer.exe  IdStackBSDBase        444  +1 TIdStackBSDBase.Receive
0049320e +012 Producer.exe  IdSocketHandle        321  +1 TIdSocketHandle.Receive
0049d843 +02b Producer.exe  IdIOHandlerStack      431  +2 TIdIOHandlerStack.ReadDataFromSource
00497142 +0e2 Producer.exe  IdIOHandler          1698 +28 TIdIOHandler.ReadFromSource
0049d367 +00b Producer.exe  IdIOHandlerStack      243  +1 TIdIOHandlerStack.Connected
0049736b +017 Producer.exe  IdIOHandler          1775  +8 TIdIOHandler.CheckForDataOnSource
0049ed86 +04e Producer.exe  BTCommAdapterBaseIndy 421  +6 TBTCommAdapterBaseIndy.ConsumeHeartBeats
0049ef19 +055 Producer.exe  BTCommAdapterBaseIndy 516  +6 TBTCommAdapterBaseIndy.ReadStompHeader
0049f636 +02a Producer.exe  BTCommAdapterIndy      66  +1 TBTCommAdapterIndy.ReadFrame
0049f199 +055 Producer.exe  BTCommAdapterBaseIndy 574  +5 TBTCommAdapterBaseIndy.ReadOneMessage
00477dce +066 Producer.exe  BTStompClient        1232  +6 TBTStompClient.WaitForReceiptFrame
00475ca0 +140 Producer.exe  BTStompClient         681 +22 TBTStompClient.Send
0047a426 +09e Producer.exe  BTAbstractTransport   191 +12 TBTAbstractTransport.InternalSend
0047a6b1 +029 Producer.exe  BTAbstractTransport   242  +3 TBTAbstractTransport.Send
004813fa +126 Producer.exe  BTConnection         1460 +40 TBTSession.Send
0047f4bc +0bc Producer.exe  BTMessageProducer     251 +27 TBTMessageProducer.Send
0047f38b +027 Producer.exe  BTMessageProducer     209  +1 TBTMessageProducer.Send
0047ba1a +022 Producer.exe  BTMQProducer          160  +2 TBTMQProducer.InternalSend
0047b8be +03e Producer.exe  BTMQProducer          125  +3 TBTMQProducer.Send
00482f72 +086 Producer.exe  ProducerLoop          128  +5 TProducerLoop.ProduceOneMessage
00482ea5 +025 Producer.exe  ProducerLoop          107  +8 TProducerLoop.Run
004831f7 +033 Producer.exe  ProducerUnit           38  +5 RunDemo
004a0754 +020 Producer.exe  Producer               15  +3 initialization
7574343b +010 kernel32.dll                                 BaseThreadInitThunk
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.330 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 08:47
Das Break verlässt nur die innere Schleife.
Danach kommt ein Disconnect, welches vermutlich einen Fehler verursachen wird.

Prüfe vor dem Disconnect, ob IsConnected True ist.
Peter

Geändert von Jasocul (23. Mai 2018 um 08:50 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#5

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 08:52
Wäre da nicht ein Exit besser? Ich kann es mit den paar Source Krümeln leider nicht testen.
Ein Exit verlässt die Prozedur, ein Break nur die Schleife. Es soll ja nur die innere Schleife verlassen werden.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 08:54
Ich seh es so wie Jasocul, das nicht das Break der Fehler ist sondern das was danach passiert.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#7

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 08:55
Das Break verlässt nur die innere Schleife.
Danach kommt ein Disconnect, welches vermutlich einen Fehler verursachen wird.

Prüfe vor dem Disconnect, ob IsConnected True ist.
Das Disconnect wird nicht erreicht, wie im Stacktrace zu erkennen ist wird als letzte Zeile der Unit das Break bzw. das IsConnected := True ausgeführt. Dann geht es nur noch ins madExcept bzw. die RTL System Units.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 09:08
ot
Ich habe da mal eine Frage, Du beginnst mit " while True do", worauf bezieht sich "True" ?
/ot
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#9

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 09:10
Das Break verlässt nur die innere Schleife.
Danach kommt ein Disconnect, welches vermutlich einen Fehler verursachen wird.

Prüfe vor dem Disconnect, ob IsConnected True ist.
Im Delphi Debugger (mit abgeschaltetem madExcept) habe ich überprüft welche Codezeilen ausgeführt werden wenn der Server nicht mehr erreicht werden kann:
als Breakpoint habe ich die Zeile mit IsConnected := False gesetzt. Dort stoppt das Programm dann wie erwartet, aber von dort geht es mit F8 sofort aus der Prozedur heraus in das finally der aufrufenden Methode.


Delphi-Quellcode:
  ProducerLoop := TProducerLoop.Create(BROKER_URL, QUEUE_NAME);
  try
    ProducerLoop.Run; // die Run-Prozedur wird bei einer Exception verlassen ...
  finally
    ProducerLoop.Free; // ... und daher das Programm hier fortgesetzt
  end;
Michael Justin
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#10

AW: EAccessViolation führt zu unerwartetem APPCRASH

  Alt 23. Mai 2018, 09:16
ot
Ich habe da mal eine Frage, Du beginnst mit " while True do", worauf bezieht sich "True" ?
/ot
True ist immer wahr, eine while True do ... Schleife ist somit eine 'Endlosschleife' da die Abbruchbedingung nie False wird
Michael Justin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.
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