2010-05-12 1 views
5

Im Rahmen der Vista-Zertifizierung, will Microsoft sicherstellen, dass eine Anwendung beendet, ohne auf eine Sperre hält an (kritischer Abschnitt):Delphi 2009: Wie verhindere ich, dass die Netzwerkanwendung kritische Bereiche durchlässt?

TEST CASE 31. Verify application does not break into a debugger with the specified AppVerifier checks (Req:3.2)

Wie sich herausstellt, Netzwerk-Anwendungen 2009 mit Delphi gebaut wird in die Pause Debugger, die nicht hilfreich Meldung anzeigt, wie folgt:

(1214.1f10): Break instruction exception - code 80000003 (first chance) 
eax=00000001 ebx=07b64ff8 ecx=a6450000 edx=0007e578 esi=0017f7e0 edi=80000003 
eip=77280004 esp=0017f780 ebp=0017f7ac iopl=0   nv up ei pl zr na pe nc 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00000246 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SysWOW64\ntdll.dll - 
ntdll!DbgBreakPoint: 
77280004 cc    int  3 

Nach dem Drücken mehrmals Go-Taste, kommen Sie über den tatsächlichen Fehler:

======================================= 
VERIFIER STOP 00000212: pid 0x18A4: Freeing virtual memory containing an active critical section. 

    076CC5DC : Critical section address. 
    01D0191C : Critical section initialization stack trace. 
    075D0000 : Memory block address. 
    00140000 : Memory block size. 


======================================= 
This verifier stop is continuable. 
After debugging it use `go' to continue. 

======================================= 

Vorausgesetzt, dass mein Code nichtleak, wie verhindere ich, dass Delphi dies tut.

Antwort

13

Indy10 gibt beim Verlassen absichtlich kritische Abschnitte ab.

IdStack.pas:

finalization 
    // Dont Free. If shutdown is from another Init section, it can cause GPF when stack 
    // tries to access it. App will kill it off anyways, so just let it leak 
    {$IFDEF IDFREEONFINAL} 
    FreeAndNil(GStackCriticalSection); 
    {$ENDIF} 

IdThread.pas:

finalization 
    // This call hangs if not all threads have been properly destroyed. 
    // But without this, bad threads can often have worse results. Catch 22. 
// TIdThread.WaitAllThreadsTerminated; 

    {$IFDEF IDFREEONFINAL} 
    //only enable this if you know your code exits thread-clean 
    FreeAndNil(GThreadCount); 
    {$ENDIF} 
  1. kopieren die beiden Dateien aus %delphi_home%\source\Indy\Indy10\System und %delphi_home%\source\Indy\Indy10\Core in Ihr Projekt oder sind sie in Suchpfad.
  2. Mit IDFREEONFINAL neu erstellen oder die IFDEF-Anweisungen entfernen.
0

Wie wissen Sie, Ihr Code ist nichts undicht, wenn Sie mit ReportMemoryLeaksOnShutdown := True oder FastMM4 in FullDebugMode ausgeführt haben, um alle memoryleaks zu fangen (Code und Delphi-Bibliotheken)?
Wenn Sie Ihre App in FullDebugMode ausführen, erhalten Sie auch den StackTrace der unfreien Speicherzuweisungen.
Sie werden wahrscheinlich feststellen, dass Sie tatsächlich den kritischen Abschnitt von IdStack verlieren.

Sie können sich diese Sitzung von CodeRage 2 ansehen: Fighting Memory Leaks for Dummies. Es zeigt hauptsächlich, wie FastMM verwendet wird, um Speicherlecks in Delphi zu verhindern. War für D2007 aber immer noch relevant für D2009.

Verwandte Themen