Einzelnen Beitrag anzeigen

mjustin

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

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

  Alt 23. Mai 2018, 07: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 10:29 Uhr) Grund: gelöst
  Mit Zitat antworten Zitat