Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ist Unit einkompiliert? (https://www.delphipraxis.net/160425-ist-unit-einkompiliert.html)

himitsu 12. Mai 2011 10:34

Ist Unit einkompiliert?
 
Moin,

gibt es eine Möglichkeit, um rauszubekommen, ob eine Unit einkompiliert ist, bzw welche Units das sind oder ob diese über eine andere BPL eingebunden sind.

Also bei BPLs, EXEn, DLLs und die .MAP wäre aktuell auch vorhanden.



Denn entweder haben wir hier extrem viele Units überall einkompilert oder die MAP zeigt, im Abschnitt Detailed map of segments, auch die Units an, welche sich in anderen BPLs befinden, welcher aber verwendet werden.

In den Abschnitten "Line numbers for ..." sind doch bestimmt nur die einkompilierten Units aufgelistet, welcher Debuginfos und genutzten Quellcode/Befehle enthalten?
Units ohne Quellcode/Befehle, sondern nur mit Type und Konstanten findet man anscheinend nicht darunter.



Wir haben hier mehrere DLLs, BPL und EXEn und ich beführchte, daß dort einige units mehrfach einkompiliert wurden ... jedenfalls ibt es beim Debuggen manchmal Probleme, daß geänderte Quellcodes nicht übernommen werden zu scheinen.
(beim vollständigen Erstellen, via FinalBuilder, gibt's dieses Problemchen dann natürlich nicht mehr)

shmia 12. Mai 2011 12:06

AW: Ist Unit einkompiliert?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei der JCL ist ein "Project Analyzer" dabei.

himitsu 12. Mai 2011 13:03

AW: Ist Unit einkompiliert?
 
Zitat:

Zitat von shmia (Beitrag 1100389)
Bei der JCL ist ein "Project Analyzer" dabei.

Gibt's den auch Einzeln? (nicht als IDE-Experte)

Ich kann hier jetzt schlecht einfach so die JCL auf unserem Firmenserver installieren, nur um einmal was nachzusehn.

Hab ja gehoft, daß man sich von delphi oder vom Compiler diese Info auch so liefern lassen kann.

simmi 12. Mai 2011 13:19

AW: Ist Unit einkompiliert?
 
Hallo,

Menü Projekt -> Optionen ->Linker -> MAP Detaliert und Du siehtst die gewünschte Information mit etwas blättern.

Deine Units befinden sich am Ende der Datei

Uwe

himitsu 12. Mai 2011 15:25

AW: Ist Unit einkompiliert?
 
Zitat:

Zitat von simmi (Beitrag 1100408)
Menü Projekt -> Optionen ->Linker -> MAP Detaliert und Du siehtst die gewünschte Information mit etwas blättern.

Deine Units befinden sich am Ende der Datei

Ist schon lange so eingestellt,
aber ich finde da keine derartige Liste.

Da gibt es höchstens eine Liste von eingebundenen Resorcendateien (.res .dfm) am Ende.
Vielleicht hat man da im XE was ausgebaut. :stupid:

simmi 12. Mai 2011 15:53

AW: Ist Unit einkompiliert?
 
Habe eben noch einmal nachgesehen. Es wird eine Datei mit dem Namen Deines Projektes und der Endung *.map angelegt.

Aber, ich habe die Einstellung vorgenommen und dachte alles ist gut. Beim nächsten öffnen von Delphi war es wieder auf "aus" gestellt. Gibt scheinbar unten links eine Möglichkeit die Einstellung für neue Projete als Srandart zu wählen.

Schau mal nach...

himitsu 12. Mai 2011 16:02

AW: Ist Unit einkompiliert?
 
Also, bei uns bleibt diese Einstellung erhalten.
Der FinalBuilder ignoriert die Projektoptionen und nutzt dort seine eigenen Einstellungen.
In Delphi und im FinalBuilder ist es auf detiliert eingestellt und zumindestens im FinalBuilder sollte diese Option ja genutzt werden, aber ich finde dennoch keine derartige Liste.

ConnorMcLeod 12. Mai 2011 19:36

AW: Ist Unit einkompiliert?
 
Du könntest in die verdächtigte Datei einen Fehler einbauen (z.B. 'abc' irgendwo im Text schreiben) und ein BuildAll machen. Wenn die Datei verwendet wird, dann wird Delphi den Fehler monieren.

himitsu 12. Mai 2011 19:47

AW: Ist Unit einkompiliert?
 
Man könnte jetzt sagen, es ginge um ein sehr großes Projekt, aus vielen BPLs, DLLs, ein paar EXEn und unzählingen
historisch gewachsener und über viele Jahre verflochtener Units.

Und da wäre mal ein Überblick was wie/wo mit drinsteckt ganz hilfreich,
denn es scheint manchmal beim Debuggen einige Problemchen zu geben.

Vor einer Weile hatten wir z.B. eine Variable, welche in einem Modul irendwie defekt zu sein schien.
Am Ende war es so, daß diese Variable an einer Stelle zwar initialisiert wurde, aber an anderer Stelle urplötzlich NIL war.
Tja, die Unit und somit auch diese globale Variable waren doppelt vorhanden, in dem Wirrwar aus DLLs und BPLs.

Bei ein paar Units könnte man das mit der "Signatur" schon machen, aber insgesamt wird es bestimmt etwas viel.

ConnorMcLeod 12. Mai 2011 20:35

AW: Ist Unit einkompiliert?
 
Diese beiden scheinen die besten Werkzeuge zu sein, um nicht verwendete Dateien im Projekt aufzuspüren.

In der MAP-Datei gibt es pro Datei eine Zeile, wie z.B.:
Line numbers for Variants(Variants.pas) segment .text

Man könnte einen Parser programmieren, der alle Zeilen auswirft, die mit 'Line numbers for' beginnen, die Dateinamen rauslesen und dann alle verbundenen Laufwerke durchsuchen lassen, ob eine Datei dieses Namens dort rumliegt. Schade, dass ich grad so wenig Zeit habe, das klingt interessant.

hoika 12. Mai 2011 21:45

AW: Ist Unit einkompiliert?
 
Hallo,

ich benutze den PAL (Pascal Analyzer).
Der hat u.a. ein Unit Use.


Heiko

ASM 12. Mai 2011 22:06

AW: Ist Unit einkompiliert?
 
Wenn es nur um ein Auflisten aller im Projekt insgesamt eingebundenen Units geht, ist das leicht und sehr übersichtlich auch mit dem Unit Dependency Analyzer von ModelMaker möglich. Das Programm ist kostenfrei.

Einzige lästige Notwendigkeit: Das Programm liest nicht selbsttätig alle Bibliotheks- und Suchpfade aus Delphi aus.
Sollen also komplett nicht nur alle direkt, sondern auch alle indirekt eingebundenen Units erfasst und auf ihre gegenseitige Abhängigkeit analysiert werden, müssen alle im Delphi-Projekt eingetragenen Bibliotheks- und Suchpfade manuell im Programm benannt werden. Das kann man zwar einzeln und daher etwas sehr mühsam im Programm selbst eintragen (unter Project Options), viel einfacher geht das aber auf einen Rutsch mit einem normalen Texteditor im Dependency Projects file (*.mmdep). Dazu muss man einfach die beiden Zeilen aus dem in Delphi eingetragenen Bibliothekspfad sowie aus dem Suchpfad des aktuellen Delphi-Projektes kopieren und in das mmdep-File unter "SearchPath=" übertragen.

Der Dependency Analyzer zeigt dann zum einen alle Units an, auf die im aktuellen Delphi-Projekt an irgendeiner Stelle in irgendeiner der eingebundenen Units mittels "Uses" Zugriff erfolgt. Außerdem kann man sich auch anzeigen lassen, welche der einzelnen Units von welchen anderen Units benötigt wird

himitsu 13. Mai 2011 11:34

AW: Ist Unit einkompiliert?
 
Nur daß die selbstparsenden Varianten irgendwie die Laufzeitpackages vergessen und dann auch Units aufgelistet werden, welche zwar enthalten sind, aber garnicht einkompiliert werden.

rollstuhlfahrer 13. Mai 2011 17:46

AW: Ist Unit einkompiliert?
 
Ich bin eben auf was gestoßen: Delphi liefert eine Liste der einkompilierten Units (leider nur die Namen, nicht auch noch die Pfade ;) ) gleich mit der Anwendung mit.
EXE-Datei mit Ressource-Editor öffnen -> RC Data -> "PACKAGEINFO". Bei XN Ressource Editor gibts dann 2 Tabs: Requires und Contains. In letzterem steht dann auch, warum die Unit eingebunden ist.

Bernhard

USchuster 13. Mai 2011 22:30

AW: Ist Unit einkompiliert?
 
Das Auslesen der Informationen aus der Ressource PACKAGEINFO geht auch mit TJclPePackageInfo (Beispiel s.u.), aber sollten die enthaltenen Units nicht im DPK stehen und wenn nicht, dann sollte es eine Warnung (W1033) geben?

Schon mal das Compilieren mit dem Parameter "--depends" probiert? ("Unit-Abhängigkeitsinformationen ausgeben" in the Projektoptionen in der IDE)

Delphi-Quellcode:
program PePackageInfoTest;

{$APPTYPE CONSOLE}

uses
  Windows, JclPEImage;

var
  I: Integer;
  PkgHandle: THandle;
  PePackageInfo: TJclPePackageInfo;
begin
  PkgHandle := LoadLibrary('c:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin\designide150.bpl');
  if PkgHandle <> 0 then
  begin
    PePackageInfo := TJclPePackageInfo.Create(PkgHandle);
    try
      WriteLn('ContainsCount: ', PePackageInfo.ContainsCount);
      for I := 0 to PePackageInfo.ContainsCount - 1 do
        WriteLn(PePackageInfo.ContainsNames[I]);
    finally
      PePackageInfo.Free;
    end;
  end;
  ReadLn;
end.


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