![]() |
Critical Sections im eigenen Prozess auflisten
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:
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:
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;
Delphi-Quellcode:
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 ;).
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; Ideen, Hinweise, Lösungen? Danke und viele Grüße, sahimba |
AW: Critical Sections im eigenen Prozess auflisten
Die Delphi-VCL verwendet Welche, die RTL nutzt auch ein paar, Fremdkomponenten (Indy nd Co.) nutzen Welche und die vielen geladenen System-DLLs benutzen auch noch die eine oder andere CS und dann gibt es noch weitere DLLs, welche z.B. von Virenscannern oder Maustreibern reingehackt wurden. :zwinker:
|
AW: Critical Sections im eigenen Prozess auflisten
CriticalSections sind ja auf unterer Ebene eine Systemstruktur, welche durch die WinAPI zur Verfügung gestellt wird. Diese Linked List, die du da parst, befindet sich im PEB (Process Environment Block) jedes Prozesses. TCriticalSections ist nur die von Delphi gekapselte Variante. Intern wird
![]() Wenn du wirklich alle von dir selbst erstellten CriticalSections ermitteln willst, solltest du dein Programmkonzept überdenken und am bessten eine globale Liste oder sowas in der Art anlegen. |
AW: Critical Sections im eigenen Prozess auflisten
Hallo Ihr Beiden und Danke für Eure Anworten. An die Critical Sections (selbstredend nicht nur jene, welche mittels Delphi gekapselt sind) der in den Prozess geladenen DLLs habe ich gar nicht gedacht :wall:. Klar "eigentlich", dass da so einige zusammen kommen. Danke, das Brett vor meinem Kopf ist weg :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz