2016-11-04 1 views
3

Ich möchte die Map-Datei als Ressource hinzufügen, dann extrahiere die Datei jedes Mal, wenn das System ausgeführt wird, um sicherzustellen, dass die Map-Datei immer richtig ist, und die Lebensdauer des Supports zu erleichtern. In Delphi 7 kann ich das Projekt mit der Map-Datei als Ressource kompilieren, aber die Map ist falsch, denn wenn eine Ausnahme ausgelöst wird, ist der Call-Stack falsch. In Delphi Seattle kann ich nicht einmal kompilieren, weil es versucht, die Ressource vor dem Generieren der Karte hinzuzufügen. Ich weiß, dass ich die Datei in einem Post-Compile thask hinzufügen kann, aber gibt es eine Möglichkeit, es in der Kompilierung/Bauzeit zu tun? Sorry, wenn ich nicht sehr genau bin, das ist meine erste Frage hier. Vielen Dank.Gibt es eine Möglichkeit, .map-Datei als Ressource des Projekts beim Kompilieren hinzuzufügen?

UPDATE

Nachdem ich ein paar Antworten zu lesen, habe ich einige der Forschung. Ich habe bereits die JEDI-Ausnahmeeinheit in meinem Projekt verwendet, aber ich kannte den JEDI-Debug-Experten nicht. Es macht genau das, was ich will und mehr. JEDI Debug Experte konvertieren eine. Map-Datei in. JDBG-Datei, die eine verschlüsselte Datei der Karte ist (Karte ist nur eine Textdatei). Auch die JDBG-Datei ist etwa 12% kleiner dann die Karte. Es hat auch die Optionen zu fügen Sie die JDBG in binäre (exe). Um das zu tun, aktivierte ich die Optionen:

  • Projekt -> JCL Debug-Experten -> Generieren .jdbg Dateien -> Aktiviert für dieses Projekt

  • Projekt -> JCL Debug-Experte -> Einfügen jdbg Daten in binären -> JCL Debug-Experten - -> löschen map-Dateien nach der Konvertierung -> für dieses Projekt

  • Projekt freigegeben> für dieses Projekt aktiviert (wenn Sie die Datei, natürlich löschen mögen)

Um dieses Tool außerhalb der IDE zu verwenden, musste ich beispielsweise mit Jenkins das Projekt erstellen, das in JEDI \ jcl \ examples \ windows \ debug \ tools \ MakeJclDbg.dpr verfügbar ist. Nach dem Build wird die exe-Datei im bin-Verzeichnis von jcl erzeugt. Wie zu verwenden:

MakeJclDbg -J -E -M map_filename

J - .JDBG Dateien erstellen

E - Insert Debug-Daten in ausführbare Dateien

M - MAP-Datei nach der Konvertierung

Löschen

Ausführbare Dateien müssen sich im selben Verzeichnis wie die MAP-Dateien befinden. Dies erstellt die jdbg-Datei (basierend auf der Map-Datei), fügt sie in die exe ein und löscht die Map. Mit diesem (und mit der Ausnahmeeinheit von JEDI), wenn eine Ausnahme ausgelöst wird, steht es mir die Stack-Trace, die Versionen aller vom System verwendeten DLLs, Betriebssysteminformationen und mehr zur Verfügung, und sende auch all dies an ein Email.

Ich erkannte, dass Embarcadero auch jdbg-Dateien von ihnen bpl haben, so denke ich, dass sie auch JCL-Tool verwenden.

+2

@Jerry: Was * Code *? Die Frage fragt nach dem Hinzufügen einer ** Ressource ** zur ausführbaren Datei. Es ist kein Code beteiligt. Es ist eine Map-Datei, die vom Linker generiert wird, wenn die ausführbare Datei erstellt wird. –

+2

@Jerry: Nein. Sie können es auch über die Befehlszeile oder ein Post-Build-Ereignis mit Brcc oder MS RCC hinzufügen. Aber selbst wenn Sie die IDE darum bitten, ist es immer noch kein Code; Es ist eine Compiler-Direktive, die eine einfache '{$ R filename.ext}' –

+3

@Rodrigo: JEDI hat die Fähigkeit, die Map-Datei in die ausführbare Datei für Sie einzubetten, und eine Debug-Einheit, die Sie direkt in Ihrer App verwenden können es ohne es auf die Festplatte zu extrahieren. Andere Debugging-Tools (wie MadExcept und Eureka) haben ebenfalls die gleiche Funktionalität. Es ist viel einfacher, einen von ihnen zu verwenden, anstatt selbst zu rollen. –

Antwort

3

Nein, die Map-Datei wird generiert, nachdem die Programmausgabe verknüpft wurde. Es ist unmöglich, eine noch nicht erzeugte Kartendatei als Ressource in das Projekt zu integrieren.

1

Sie vermissen den Punkt.

Die MAP-Dateien werden als separate Datei zu erzeugt, um die Größe der ausführbaren vermeiden erhöhen. Der Versuch, diese Datei als Ressource in die ausführbare Datei einzubetten, widerspricht einfach dem Zweck.

Sie haben nicht erwähnt, welches Debugframework Sie verwenden. Es gibt jedoch andere Möglichkeiten, Debug-Informationen bereitzustellen, und ich schlage vor, dass Sie auf die Dokumentation des Debug-Frameworks verweisen, das Sie für die Besonderheiten verwenden. Ich werde nur einige allgemeine Konzepte für die meisten Frameworks, die ich ausprobiert habe, anbieten.

  • Wenn Sie mit erhöhter EXE Größe zufrieden sind und Debug-Informationen in der ausführbaren Datei enthalten sein sollen: Verwenden Sie nicht die Map-Datei Option. Aktivieren Sie einfach die Verbindungsoption zu include debug information. (Und stellen Sie sicher, dass Ihr Debug-Framework es verwendet.)
  • Die meisten Debug-Frameworks empfehlen die Kompilierung mit stack frames aktiviert. Dies ist sehr wichtig, da es dem Debug-Framework das Abrufen des Aufruf-Stacks erleichtert.
  • Einige Debugger-Frameworks verfügen über eine Funktion, die das Ermitteln fehlender Call-Stack-Informationen ermöglicht. Wenn diese Option aktiviert ist, müssen Sie Stapeleinträge manuell ignorieren, die eigentlich keinen Sinn ergeben.
  • Vergessen Sie natürlich nicht, dass alle Einheiten, die ohne Debug-Informationen kompiliert werden, keine Debug-Informationen enthalten, die in die endgültige ausführbare Datei aufgenommen werden.
+0

Ich benutze JEDI-Tool als Debug-Framework. Ich wusste nichts über die Debug-Informationen.Ich habe hier getestet, aber die Größe von EXE erhöht zu viel, viel mehr als einfach die Größe der Map-Datei in EXE hinzufügen. Ich denke, ich werde weiterhin die Map-Datei verwenden. –

Verwandte Themen