AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FastMM4 und Delphi 7

Ein Thema von Bernd1982 · begonnen am 1. Jan 2018 · letzter Beitrag vom 2. Jan 2018
Antwort Antwort
Bernd1982

Registriert seit: 22. Dez 2009
11 Beiträge
 
#1

FastMM4 und Delphi 7

  Alt 1. Jan 2018, 21:32
Ich möchte FastMM4 mit Delphi 7 verwenden und habe eine große Applikation. Ich schreibe FastMM4 als erstes USES im meine .dpr.

Egal, was ich mache, in der system.pas wird schon Speicher mit dem alten MemoryManager alloziert, sodass FastMM4 nicht startet.

Ich habe mit Debug-DCUs kompiliert und komme mit [F7] direkt in der SysInit.pas rein. Der angezeigte SysInit.pas-Quelltext stimmt aber scheinbar nicht mit der verwendeten DCU überein, der Debugger springt in Zeilen, die meines Erachtens nicht die real verwendeten sind. Ich kann also nicht nachvollziehen, was da wirklich passiert.

Ich dachte mir, kompiliere doch die system.pas mit ihrer SysInit.pas neu und das funktionierte auch:

"C:\Program Files (X86)\Borland\Delphi3\Bin\DCC32.EXE" -$D+ -Y SYSTEM

und ohne Debug-Info:

"C:\Program Files (X86)\Borland\Delphi3\Bin\DCC32.EXE" -$D- -Y SYSTEM

Die entstandenen DCUs habe ich in die Verzeichnisse "C:\Program Files (x86)\Borland\Delphi7\Lib\Debug" und "C:\Program Files (x86)\Borland\Delphi7\Lib". Ich glaube auch, dass der VirtualStore mir keine Streiche spielt, weil er für meinen Benutzer an dieser Stelle leer ist.

Es ändert sich aber nichts. Der Debugger springt wild in SysInit.pas und System.pas herum. Irgendwas reserviert dort dann Speicher mit dem alten MemoryManager und FastMM4 quittiert den Dienst.

Mit den mitgelieferten Demo-Programmen funktioniert der FastMM4.

Ich wäre dankbar für jeden Hinweis!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#2

AW: FastMM4 und Delphi 7

  Alt 1. Jan 2018, 23:46
Ich hab grade nur 'nen FastMM4 von 2007 hier rumliegen, aber da wird sich wohl nicht viel geändert haben.
Zitat von FstMM4.pas:
Delphi-Quellcode:
{Checks that no other memory manager has been installed after the RTL MM and
that there are currently no live pointers allocated through the RTL MM.}

function CheckCanInstallMemoryManager: boolean;
begin
  {Default to error}
  Result := False;
  {Is FastMM already installed?}
  if FastMMIsInstalled then
  begin
{$ifdef UseOutputDebugString}
    OutputDebugString(AlreadyInstalledMsg);
{$endif}
{$ifndef NoMessageBoxes}
    AppendStringToModuleName(AlreadyInstalledTitle, LErrorMessageTitle);
    ShowMessageBox(AlreadyInstalledMsg, LErrorMessageTitle);
{$endif}
    exit;
  end;
  ...
  usw.
  ...
end;


initialization
{$ifndef BCB}
  {Initialize all the lookup tables, etc. for the memory manager}
  InitializeMemoryManager;
  {Has another MM been set, or has the Borland MM been used? If so, this file
   is not the first unit in the uses clause of the project's .dpr file.}

  if CheckCanInstallMemoryManager then
  begin
  {$ifdef ClearLogFileOnStartup}
    DeleteEventLog;
  {$endif}
    InstallMemoryManager;
  end;
Wenn etwas Anderes vorher Speicher mit DelphiMM reserviert hatte oder sonst irgendwas passt nicht, dann installiert sich FastMM nicht und gibt dafür eine Fehlermeldung aus.

Aktiviere mal UseOutputDebugString, starte dein Programm im Debugger und schau was im Log passiert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Bernd1982

Registriert seit: 22. Dez 2009
11 Beiträge
 
#3

AW: FastMM4 und Delphi 7

  Alt 2. Jan 2018, 00:15
Danke für Deine Antwort! Ich hatte vorher schon über OutputDebugString gelesen, aber ich habe keine Ahnung wie ich das aktiviere und wo ich dann das Log lesen kann. Googeln hat mir eben nichts recht gebracht. Vielleicht kannst Du mir nochmal mit den Debug-Logs auf die Sprünge helfen!

Ich habe in der system.pas debuggt und festgestellt, dass der FastMM4 wahrscheinlich in der Schlange der Units nicht vorne initialisiert wird, sondern halt zu spät. Obwohl in der *.dpr das FastMM4 zuerst eingetragen ist.

Gibt es sonst einen Grund, warum andere Sachen zuerst initialisiert werden? Z.B. die Textressourcen werden anscheinend zuerst gelesen. Bei den Demo-Programmen von FastMM4 kommen die erst später dran. Ich könnt' in die Tischplatte beißen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#4

AW: FastMM4 und Delphi 7

  Alt 2. Jan 2018, 00:20
Der Compiler geht die Uses-Liste in der DPR und dann in den verlinkten Units durch. Die Units in der DPR werden der Reihe nach initialisiert, außer in einer der Units wird wiederrum was eingebunden, was eventuell auch in der DPR steht, dann wird das natürlich vorgezogen.

Das Erste in der DPR kann also nur als Erstes kommen.
Und da FastMM außer den System-Units, der Windows.pas (was sonst nichts einbindet und keine Initialization besitzt) und seinen eigenen Units nichts einbindet, muß FastMM auch als Erstes geladen werden, wenn es in der DPR das Erste ist.
Vorher gibt es nur die zwei System-Units, welche immer automatisch zuerst eingebunden werden, also System.pas und SysInit.pas.

Bei Delphi 7 und Davor gibt es nur eine "Ausnahme" ... hast du dir vielleicht den Delphi 7-Virus eingefangen?
Für Delphi 7 gibt es einen "Test"-Virus der die System.pas ändert und neu kompiliert, denn blöder Weise arbeiten viele als Administrator und wenn nicht, dann haben sie dem Programmverzeichnis Schreibrechte gegeben, damit Delphi 7 immernoch funktioniert, da es im Programmverzeichnis rumschreibt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Jan 2018 um 00:25 Uhr)
  Mit Zitat antworten Zitat
Bernd1982

Registriert seit: 22. Dez 2009
11 Beiträge
 
#5

AW: FastMM4 und Delphi 7

  Alt 2. Jan 2018, 00:25
Genau so sollte es sein. Isses aber leider nicht FastMM4 kommt trotzdem später...

Kannst Du mir bitte nochmal einen Hinweis zu dem UseOutputDebugString geben? Wie aktiviere ich das? Wo und wie kann ich das Log lesen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#6

AW: FastMM4 und Delphi 7

  Alt 2. Jan 2018, 00:32
Aktivieren: in der Options-INC des FastMM

OutputDebugString wird an den Debugger geschickt, wenn Einer verbunden ist. (Programm im Debugger gestartet)
Und Delphi schreibt das dann ins Ereignisprotokoll, welches in der Debug-Ansicht standardmäßig angezeigt wird. (Ansicht > Debugfenster > Ereignisprotokoll)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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