Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringlist Quellcode verändern (https://www.delphipraxis.net/193083-tstringlist-quellcode-veraendern.html)

DevLinus 19. Jun 2017 07:05

Delphi-Version: 10 Seattle

TStringlist Quellcode verändern
 
Guten Morgen,
ich versuche gerade Memleaks aus einem Programm raus zubekommen. Ich war jetzt schon ziemlich erfolgreich habe aber noch 2 Stringlisten die nicht gefreet werden.
Da das Programm extrem viele initialization und class Constructoren (Mehr als 350) besitzt würde ich gerne die TStringlist so anpassen das sie beim Create eine ID gesetzt bekommt und die ID in meinen Logger rein schreibt und im Destroy die ID des Objektes auch in den Logger reinschreibt damit ich weiß welche Stringlist mit jeweiliger ID nicht frei gegeben wird. Leider wird die eingebaute Änderung nicht mit Compiliert.
Ist dies Möglich? Wenn ja, wie?

Danke!

SneakyBagels 19. Jun 2017 07:07

AW: TStringlist Quellcode verändern
 
Zitat:

Leider wird die eingebaute Änderung nicht mit Compiliert.
Hier kann vermutlich keiner aus Kaffeesatz lesen daher... wie sieht die Änderung denn aus? :P

Aviator 19. Jun 2017 07:12

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von SneakyBagels (Beitrag 1374817)
Zitat:

Leider wird die eingebaute Änderung nicht mit Compiliert.
Hier kann vermutlich keiner aus Kaffeesatz lesen daher... wie sieht die Änderung denn aus? :P

Das Problem ist wohl eher, dass die System Units nicht mehr neu kompiliert werden. Eventuell reicht es, wenn du die Debug DCUs mal neu erzeugen lässt. Schau dir dazu mal die Compilerschalter an.

DevLinus 19. Jun 2017 07:19

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von Aviator (Beitrag 1374819)
Zitat:

Zitat von SneakyBagels (Beitrag 1374817)
Zitat:

Leider wird die eingebaute Änderung nicht mit Compiliert.
Hier kann vermutlich keiner aus Kaffeesatz lesen daher... wie sieht die Änderung denn aus? :P

Das Problem ist wohl eher, dass die System Units nicht mehr neu kompiliert werden. Eventuell reicht es, wenn du die Debug DCUs mal neu erzeugen lässt. Schau dir dazu mal die Compilerschalter an.

Genau :) welchen Compilerschalter meinst du? Ich habe bei Debuggen "Mit Debug- DCUs angemacht" Jetzt habe ich da wenigstens Haltepunkte in der Unit.

SneakyBagels 19. Jun 2017 07:22

AW: TStringlist Quellcode verändern
 
Zitat:

Das Problem ist wohl eher, dass die System Units nicht mehr neu kompiliert werden.
An den System-Units würde ich gar nicht erst rumfummeln.

Zitat:

würde ich gerne die TStringlist so anpassen das sie beim Create eine ID gesetzt bekommt
Ich würde das einfach so machen...

Delphi-Quellcode:
// Das hier alles kommt ins eigene Projekt - nicht in die System-Units
type
 TStringList = class(System.Classes.TStringList)
 public
  ID: Integer; // <= ID erweitern
  constructor Create; overload;
 end;

// Konstruktor
constructor TStringList.Create;
begin
 ID := Random(1234567890) + 1; // ID setzen (nach Möglichkeit irgendeinen besseren Algorithmus)
 inherited Create;
end;


// Test
procedure TForm2.Button9Click(Sender: TObject);
var
 sl1, sl2: TStringList;
begin
 sl1 := TStringList.Create;
 sl2 := TStringList.Create;

 ShowMessage('SL1-ID: ' + IntToStr(sl1.ID));
 ShowMessage('SL2-ID: ' + IntToStr(sl2.ID));

 sl1.Free;
 sl2.Free;
end;

haentschman 19. Jun 2017 07:26

AW: TStringlist Quellcode verändern
 
Moin...:P
An dieser Stelle wieder mal die üblichen Verdächtigen. 8-)

1: FastMM
2: MadExcept

Übersichtlicher ist imho der MadExcept. Der zeigt beim Progammende (mit Ressource Leaks) die Stellen an. Manchmal ist auch der bei komischen Konstellationen, wie Alle anderen auch, überfordert. :cry:

...Versuch macht klug. Besser als in den System Units herumpfuschen. :P

Aviator 19. Jun 2017 07:27

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von SneakyBagels (Beitrag 1374821)
Zitat:

würde ich gerne die TStringlist so anpassen das sie beim Create eine ID gesetzt bekommt
Ich würde das einfach so machen...

Hätte ich auch fast vogeschlagen. Aber dann müsste er sich eine neue Unit machen und die überall einbinden. Könnte bei 350 Units etwas Arbeit bedeuten.

@TE: Erzeuge mal das Projekt neu. Nicht nur kompilieren. Der Schalter ist zumindest der den ich meinte.

DevLinus 19. Jun 2017 07:29

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von SneakyBagels (Beitrag 1374821)
Zitat:

Das Problem ist wohl eher, dass die System Units nicht mehr neu kompiliert werden.
An den System-Units würde ich gar nicht erst rumfummeln.

Zitat:

würde ich gerne die TStringlist so anpassen das sie beim Create eine ID gesetzt bekommt
Ich würde das einfach so machen...

Delphi-Quellcode:
// Das hier alles kommt ins eigene Projekt - nicht in die System-Units
type
 TStringList = class(System.Classes.TStringList)
 public
  ID: Integer; // <= ID erweitern
  constructor Create; overload;
 end;

// Konstruktor
constructor TStringList.Create;
begin
 ID := Random(1234567890) + 1; // ID setzen
 inherited Create;
end;


// Test
procedure TForm2.Button9Click(Sender: TObject);
var
 sl1, sl2: TStringList;
begin
 sl1 := TStringList.Create;
 sl2 := TStringList.Create;

 ShowMessage('SL1-ID: ' + IntToStr(sl1.ID));
 ShowMessage('SL2-ID: ' + IntToStr(sl2.ID));

 sl1.Free;
 sl2.Free;
end;

Prinzipiell stimme ich dir vollkommen zu. Das Problem ist in dem Projekt werden fast 3 Millionen Zeilen Code mit ein Compiliert und Tausende Stringlisten verwendet. Wenn ich die alle durch meine austauschen soll werde ich diesen Monat nicht mehr fertig.

SneakyBagels 19. Jun 2017 07:29

AW: TStringlist Quellcode verändern
 
Zitat:

Könnte bei 350 Units etwas Arbeit bedeuten.
Bei einem 350-Units-Projekt sollte nach Möglichkeit irgendeine Unit vorhanden sein, wo man solchen kram reinschreibt :P

Zitat:

Wenn ich die alle durch meine austauschen soll werde ich diesen Monat nicht mehr fertig.
Was meint du mit austauschen? Hier müsstest du nichts austauschen sondern einfach nur den Kontruktor überschreiben. Der Typ der Stringliste bleibt gleich.

DeddyH 19. Jun 2017 07:31

AW: TStringlist Quellcode verändern
 
Ich würde es so versuchen: eine eigene Unit mit einer Cracker-Klasse erstellen.
Delphi-Quellcode:
unit StringlistCracker;

interface

uses System.Classes;

type
  TStringList = class(System.Classes.TStringList)
  private
    FID: integer;
    procedure Log;
    class var FInstanceCount: integer;
  public
    constructor Create;
    destructor Destroy; override;
    property ID: integer read FID;
  end;


implementation

constructor TStringList.Create;
begin
  inherited;
  inc(FInstanceCount);
  FID := FInstanceCount;
end;

destructor TStringList.Destroy;
begin
  Log;
  inherited;
end;

procedure TStringList.Log;
begin
  // Hier jetzt den Logging-Code
end;


end.
Und diese Unit überall dort, wo die Stringlisten benutzt werden, als letzte in der uses-Klausel des interface-Abschnitts einfügen. Ungetestet!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.
Seite 1 von 3  1 23      

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