Einzelnen Beitrag anzeigen

Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#10

Re: Windows7 64Bit und D2010: IDE friert beim Ausfuehren(F9)

  Alt 11. Sep 2009, 12:31
Danke fuer die Antworten, aber der Patch hat keine besserung gebracht und die Firewall/AV blockieren Delphi in keinster Weise, ABER der Tipp mit F7 bringt mich ein Stueck weiter. Die IDE friert nicht direkt ein, sondern in der unit idThread in Zeile 351 (TIdThread.Execute):


Delphi-Quellcode:
try
              if Loop then begin
                while not Stopped do begin
                  try
                    Run; <<<<<<<<<
                  except
                    on E: Exception do begin
                      if not HandleRunException(E) then begin
                        Terminate;
                        raise;
                      end;
                    end;
                  end;
                end;
F8/F9 nach dem BP friert die IDE ein, steppe ich hingegen mit F7 weiter komme ich bis IdCustomTCPServer Zeile 933 (TIdListenerThread.Run):


Delphi-Quellcode:
  try
    // GetYarn can raise exceptions
    LYarn := Server.Scheduler.AcquireYarn;

    LIOHandler := Server.IOHandler.Accept(Binding, Self, LYarn); <<<<<<<<<
    if LIOHandler = nil then begin
      // Listening has finished
      Stop;
      Abort;
    end else begin
      // We have accepted the connection and need to handle it
      LPeer := TIdTCPConnection.Create(nil);
      LPeer.IOHandler := LIOHandler;
      LPeer.ManagedIOHandler := True;
    end;
Steppe ich hier wiederum mit F7 weiter komme ich bis IdServerIOHandlerSocket Zeile 131 (TIdServerIOHandlerSocket.Accept):

Delphi-Quellcode:
  while not AListenerThread.Stopped do begin
    if ASocket.Select(250) then begin <<<<<<<<<<
      if LIOHandler.Binding.Accept(ASocket.Handle) then begin
        LIOHandler.AfterAccept;
        Result := LIOHandler;
        LIOHandler:=nil;
        Break;
      end;
    end;
  end;
Danach gehts hierhin: IdSocketHandle Zeile 535:

Delphi-Quellcode:
function TIdSocketHandle.Select(ATimeOut: Integer = IdTimeoutInfinite): Boolean;
begin
  Result := FReadSocketList.SelectRead(ATimeOut); <<<<<
  TIdAntiFreezeBase.DoProcess(Result = False);
end;

Anschließend hierher: IdStackWindows Zeile 995:

Delphi-Quellcode:
function TIdSocketListWindows.SelectRead(const ATimeout: Integer): Boolean;
var
  LSet: TFDSet;
begin
  // Windows updates this structure on return, so we need to copy it each time we need it
  GetFDSet(LSet);
  FDSelect(@LSet, nil, nil, ATimeout); <<<<<<<
  Result := LSet.fd_count > 0;
end;
Gleiche Unit Zeile 1013 (TIdSocketListWindows.FDSelect):

Delphi-Quellcode:
class function TIdSocketListWindows.FDSelect(AReadSet, AWriteSet,
  AExceptSet: PFDSet; const ATimeout: Integer): Boolean;
var
  LResult: Integer;
  LTime: TTimeVal;
  LTimePtr: PTimeVal;
begin
  if ATimeout = IdTimeoutInfinite then begin
    LTimePtr := nil;
  end else begin
    LTime.tv_sec := ATimeout div 1000;
    LTime.tv_usec := (ATimeout mod 1000) * 1000;
    LTimePtr := @LTime;
  end;
  LResult := IdWinsock2.select(0, AReadSet, AWriteSet, AExceptSet, LTimePtr); <<<<<<<
                          
  Result := GBSDStack.CheckForSocketError(LResult) > 0;
end;
Und letzendlich laden wir hier in IdWinsock2 Zeile 5228 (Stub_select):

Delphi-Quellcode:
function Stub_select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Integer; stdcall;
begin
  @select := FixupStub(hWinSockDll, 'select'); {Do not Localize}
  Result := select(nfds, readfds, writefds, exceptfds, timeout); <<<<<<<
end;
Hier ist mit Sourcecode Schluss, weiter gehts in der CPU-Ansicht:

Freeze bei
Code:
004D759F FF15187B6100     call dword ptr [$00617b18]
[$00617b18] ist WS2_32.select. Hier friert die IDE beim ersten call ein:

Code:
76364988 E803CAFFFF      call $76361390
In diesem call passiert eigentlich nichts, keine calls/jmps oder aenhliches. Es wir nur ein bisschen in Speicher rumgeschrieben.

Steppe ich mit F8 ueber diesen call friert die IDE ein.
Steppe ich mit F7 durch den call durch komme ich zum naechsten lock:

Code:
76364A1D FF5060 call dowrd ptr [eax+$60]
Danach haengt es hier:

Code:
743D6572 E848B1FFFF      call $743d16bf
Hier findet man wieder nur Speicherzugriffe, keinerlei calls oder jmps ... Die Spur verlaeuft sich im Sand.

Grueße,
Win32
  Mit Zitat antworten Zitat