2010-05-12 13 views
5

Como parte de la certificación de Vista, Microsoft quiere asegurarse de que una aplicación acaba sin aferrarse a una cerradura (sección crítica):Delphi 2009: ¿Cómo evito que la aplicación de red pierda una sección crítica?

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

Como resultado, las aplicaciones de red construidos usando Delphi 2009 no entrar en el depurador, que muestra el mensaje inútil de la siguiente manera:

(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 

Después de golpear varias veces el botón Ir, se encuentra con el error real:

======================================= 
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. 

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

Dado que mi código no tiene fugas TCriticalSection, ¿cómo evito que Delphi lo haga?

Respuesta

13

Indy10 filtra intencionadamente secciones críticas al salir.

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. Copiar los dos archivos del %delphi_home%\source\Indy\Indy10\System y %delphi_home%\source\Indy\Indy10\Core en su proyecto, o los incluyen en la ruta de búsqueda.
  2. Reconstruya con IDFREEONFINAL o elimine las directivas IFDEF.
0

¿Cómo sabe el código no se está escapando nada a menos que haya ejecutado con ReportMemoryLeaksOnShutdown := True o FastMM4 en FullDebugMode a coger todos memoryleaks (su código y bibliotecas de Delphi)?
Ejecutar su aplicación en FullDebugMode también le daría el StackTrace de las asignaciones de memoria sin actualizar.
Probablemente encontrará que, de hecho, está filtrando la sección IdStack Critical.

Es posible que desee echarle un vistazo a esta sesión de CodeRage 2: Fighting Memory Leaks for Dummies. Muestra principalmente cómo usar FastMM para prevenir/detectar pérdidas de memoria en Delphi. Fue para D2007 pero sigue siendo relevante para D2009.

Cuestiones relacionadas