Einzelnen Beitrag anzeigen

sahimba

Registriert seit: 14. Nov 2011
Ort: Berlin, Hauptstadt der DDR
137 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Critical Sections im eigenen Prozess auflisten

  Alt 21. Sep 2012, 08:37
Hallo und guten Morgen,

ich versuche gerade, innerhalb eines Prozesses eine Liste der Critical Sections zu ermitteln. Lt. SDK steht mir hierzu insbesondere die PRTLCriticalSectionDebug-Struktur zur Verfügung, welche mittels einer doppelt verketten Liste innerhalb dieser verweist.

Hier aber mühe ich mich erfolglos ab, der folgende Code macht Probleme:

Delphi-Quellcode:
var
  LDebugInfo: PRTLCriticalSectionDebug;
  LCritical: PRTLCriticalSection;

  LDebugInfo := TCriticalSectionAccess(GCriticalSection).FSection.DebugInfo;
  while Assigned(LDebugInfo) do begin
    LCritical := LDebugInfo.CriticalSection;
    Assert(LDebugInfo = LCritical.DebugInfo);
    if Assigned(LDebugInfo.ProcessLocksList.FLink) then
      LDebugInfo := Pointer(Cardinal(LDebugInfo.ProcessLocksList.FLink) -8)
    else
      LDebugInfo := nil;
  end;
Grundsätzlich scheint er zwar zu funktionieren, die Assertion ist zumindest ein gutes Indiz dafür, es gibt aber Probleme, so dass ich wohl annehme, im SDK irgendetwas übersehen zu haben. Zum einen hätte ich nach lesen des SDK erwartet, dass das letzte Listenelement (LDebugInfo.ProcessLocksList.FLink) auf nil verweist, dem ist tatsächlich jedoch nicht der Fall, so dass obiger Code in einer Endlosschleife landet. Den Code habe ich somit (zunächst) wie folgt geändert:

Delphi-Quellcode:
var
  LFirstInfo,
  LDebugInfo: PRTLCriticalSectionDebug;
  LCritical: PRTLCriticalSection;

  LFirstInfo := TCriticalSectionAccess(GCriticalSection).FSection.DebugInfo;
  LDebugInfo := LFirstInfo;
  while Assigned(LDebugInfo) do begin
    LCritical := LDebugInfo.CriticalSection;
    Assert(LDebugInfo = LCritical.DebugInfo);
    if Assigned(LDebugInfo.ProcessLocksList.FLink) then
      LDebugInfo := PRTLCriticalSectionDebug(Cardinal(LDebugInfo.ProcessLocksList.FLink) -8)
    else
      LDebugInfo := nil;
    if LDebugInfo = LFirstInfo then
      Break;
  end;
So weit, so gut. Leider sind wir nun beim nächsten Problem angelangt. Es werden "zu viele" Critical Sections gefunden. In dem Sinne "zu viele" als dass ich mir doch relativ sicher bin, dass in meinem Projekt keine rund 240 Critical Sections verwendet werden .

Ideen, Hinweise, Lösungen?

Danke und viele Grüße,
sahimba
  Mit Zitat antworten Zitat