Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Critical Sections im eigenen Prozess auflisten (https://www.delphipraxis.net/170524-critical-sections-im-eigenen-prozess-auflisten.html)

sahimba 21. Sep 2012 08:37

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:
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

himitsu 21. Sep 2012 09:24

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:

Zacherl 21. Sep 2012 11:02

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 MSDN-Library durchsuchenInitializeCriticalSection aufgerufen, was zur Folge hat, dass die CS automatisch auch in der besagten LinkedList im PEB eingetragen wird. Natürlich landen in dieser Liste folglich auch alle die CriticalSections, die nicht über die gekapselte Delphi Klasse erzeugt werden.

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.

sahimba 21. Sep 2012 11:17

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 10:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz