Delphi-PRAXiS

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!

TigerLilly 19. Jun 2017 07:34

AW: TStringlist Quellcode verändern
 
1. Eine eigene Unit XY.pas mit dem angeführten Code erstellen
2. Suchen/Ersetzen: System.Classes --> System.Classes, XY

Das wars. Dauert 5 Minuten.

DevLinus 19. Jun 2017 07:34

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von SneakyBagels (Beitrag 1374826)
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.

Naja ich muss meinen Programm ja sagen das er die TStringlist verwenden soll und nicht die Standard. Das heißt bei allen Units die Uses hinzufügen/austauschen.

SneakyBagels 19. Jun 2017 07:35

AW: TStringlist Quellcode verändern
 
Zitat:

Naja ich muss meinen Programm ja sagen das er die TStringlist verwenden soll und nicht die Standard. Das heißt bei allen Units die Uses hinzufügen/austauschen.
Deswegen ist es ja eine Cracker-Liste. Da muss man nix am Datentyp ändern. Man benutzt wie gewohnt TStringList (oder was auch immer du halt benutzt).

haentschman 19. Jun 2017 07:37

AW: TStringlist Quellcode verändern
 
Nochmal...:P (weil es in den anderen Beiträgen untergeht :wink:)
Ohne Quelltext Änderungen und ohne extra Units: MadExcept. : 8-)

Wenn er das auch nicht auflösen kann, hast genug Beispiele für die ID in der Klasse. :thumb:

freimatz 21. Jun 2017 07:26

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von SneakyBagels (Beitrag 1374826)
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.

Dann schreib doch ein Programm das das erledigt :-P

Und noch ein Aspekt, wenn auch zu spät: nicht TStringlist verwenden. Die TStringlist verwende man nur wenn man eine Liste von Strings benötigt. Das ist meist nicht der Fall. 1. Oft wird diese missbraucht und man stopft alles mögliche da rein. Besser TList<> o.ä. Dann wird oft 2. ein string für alles möglich verwendet was besser ein TName, TDatei, TId, etc. sein sollte. Und dann siehe 1.
Siehe auch https://de.wikipedia.org/wiki/Law_of_the_Instrument

p80286 21. Jun 2017 11:25

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von haentschman (Beitrag 1374831)
Nochmal...:P (weil es in den anderen Beiträgen untergeht :wink:)
Ohne Quelltext Änderungen und ohne extra Units: MadExcept. : 8-)

Wenn er das auch nicht auflösen kann, hast genug Beispiele für die ID in der Klasse. :thumb:

Suchen wo es klemmt ohne jedweden kreativen Lösungsansatz, wie langweilig......


Gruß
k-H

haentschman 21. Jun 2017 12:02

AW: TStringlist Quellcode verändern
 
Moin...:P
Zitat:

Suchen wo es klemmt ohne jedweden kreativen Lösungsansatz, wie langweilig......
Ich kann leider nicht erkennen ob das ironisch gemeint war...:gruebel:

freimatz 21. Jun 2017 13:17

AW: TStringlist Quellcode verändern
 
Eher sarkastisch ;-)

hoika 21. Jun 2017 13:25

AW: TStringlist Quellcode verändern
 
Hallo,
noch einmal an den TE (wurde bereits genannt).
Was spricht gegen die Verwendung von FastMM4?

SneakyBagels 21. Jun 2017 13:28

AW: TStringlist Quellcode verändern
 
Zitat:

Was spricht gegen die Verwendung von FastMM4?
Er müsste doch lediglich die zuvor genannte Cracker-Klasse einsetzen oder ist das Problem nun ein anderes?

himitsu 21. Jun 2017 13:34

AW: TStringlist Quellcode verändern
 
Zitat:

Zitat von hoika (Beitrag 1375068)
Was spricht gegen die Verwendung von FastMM4?

Seit 2006 ist FastMM Besandteil der RTL (DelphiMM wurde schon vor langer Zeit durch eine Version des FastMM ersetzt ... zum Debuggen kann man alternativ auf die große FastMM-Version umsteigen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 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