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