2010-05-04 14 views
11

Ich benutze Delphi 2010 und ich frage mich, ob es eine Möglichkeit gibt, durch Code, der in dem Projekt ist, zu verfolgen, ohne die Aufrufe von enthaltenen VCLs zu verfolgen.Gibt es eine Möglichkeit, in Delphi nur die Projektquelle zu verfolgen?

Zum Beispiel - stellen Sie in einem Haltepunkt und verwenden dann Umschalt +F7 durch line-by-line zu verfolgen. Jetzt kommt es zu einem Anruf bei einer langwierigen Prozedur in einer VCL - in meinem Fall ist es oft ein Measurement Studio oder eine andere Komponente, die die Doodads für eine Reihe von E/A-, OPC- oder anderen Bits zeichnet. Jedenfalls springt der Debugger aus der aktiven Quelldatei, öffnet die Komponentenquelle und durchläuft diese Zeile für Zeile. Das sind oft Hunderte oder Tausende von Codezeilen, die mir egal sind - ich möchte nur, dass es ausgeführt wird und zur nächsten Quellzeile in MY-Projekt zurückkehrt.

Offensichtlich können Sie dies tun, indem Sie Haltepunkte um jede Instanz eines externen Anrufs setzen, aber oft gibt es zu viele, um dies praktisch zu machen - ich würde eine Stunde lang jedes Mal hundert Haltepunkte setzen, wenn ich durch einen gehen wollte Codeabschnitt.

Gibt es irgendwo eine Einstellung oder ein Werkzeug, das das kann? Erlauben Sie es einem, den Code innerhalb des Projekts zu verfolgen, während Sie im Hintergrund Code ausführen, der sich außerhalb des Projekts befindet?

Antwort

12

Der Debugger wird nicht durch Einheiten Schritt, der nicht Debug-Informationen haben, so das Ziel der Compiler Debug-Informationen zu machen ist, weglassen von den Einheiten, die Sie nicht interessieren.

deine Bibliothek Einheiten in ein separates Bibliotheksprojekt. Das gibt Ihnen die Möglichkeit, separate Kompilierungseinstellungen für diese Einheiten zu erstellen, ohne dass sich Ihr Ihr Projekt. Kompilieren Sie die Bibliothek, ohne dass Debuginformationen aktiviert sind. Entfernen Sie dann diese Bibliothekseinheiten aus Ihrem Projekt. Sie können sie weiterhin verwenden, aber sie gehören nicht mehr zu Ihrem Projekt. Ein wichtiger Aspekt hier ist, dass die DCUs in einem separaten Verzeichnis aus dem Quellcode befinden sollten. Wenn der Compiler DCUs findet und der Quellcode im selben Ordner angezeigt wird, ist es wahrscheinlich, dass dieser Code neu kompiliert wird, wenn Sie es nicht wirklich wollen. Stellen Sie den "DCU-Ausgabeordner" Ihres Projekts auf etwas anderes als das Standardverzeichnis ein.

Um es wirklich richtig zu machen, können Sie tun, was die VCL tut und zwei verschiedene Versionen Ihrer Bibliotheken kompilieren. Kompilieren Sie einen mit Debug-Informationen und einen ohne und legen Sie die kompilierten Dateien in verschiedenen Verzeichnissen ab. Fügen Sie das Verzeichnis mit den Debug-Versionen zu Ihrer Delphi-Konfiguration hinzu; Dort sollte bereits ein Ordner aufgeführt sein, der die von Delphi bereitgestellten Debug-DCUs enthält.

Wenn Sie zwei verschiedene Versionen einrichten, können Sie wählen, ob Sie in den Bibliothekscode einsteigen möchten. Schalten Sie einfach die Option Debug-DCUs verwenden in Ihren Projekteinstellungen ein. Delphi fügt automatisch den Debug-Versionsordner aus dem Suchpfad hinzu und entfernt ihn, wenn Sie diese Einstellung ändern.


Beachten Sie, dass, auch wenn Sie eine separate Bibliothek-Projekt für Ihre Bibliothek Einheiten haben werden, Sie brauchen sich nicht zu verknüpfen oder die DLL oder Paket zu verteilen, die das Projekt generiert. Sie können die DCU-Dateien weiterhin direkt in Ihrem EXE-Projekt verwenden. Sie richten nur das separate Projekt ein, sodass Sie für diese Einheiten verschiedene Kompilierungseinstellungen auswählen können. Fügen Sie den DCU-Ausgabeordner des Bibliotheksprojekts dem Suchpfad Ihres EXE-Projekts hinzu, und Sie können die Einheiten direkt weiter verwenden, ohne die DLL oder das Paket des Bibliotheksprojekts verteilen zu müssen.

Die IDE versucht möglicherweise, dem Suchpfad automatisch neue Verzeichnisse hinzuzufügen. Stehen Sie nicht dafür ein. Wenn dort ein Quellverzeichnis vorhanden ist, das die IDE für Sie hinzugefügt hat und Sie es nicht dort haben wollen, können Sie es gerne entfernen. Die IDE versucht nur, hilfreich zu sein, aber sie weiß nicht, ob Sie getrennte Quell- und kompilierte Ordner haben möchten.

+0

Danke, Rob - das ist sehr hilfreich. Momentan sind die Bibliotheken nicht im Projekt enthalten, es sind einfach BPLs, die über "Komponenten-> Pakete installieren ..." direkt zu Delphi hinzugefügt wurden. Ich habe jedoch mein bin/packages-Verzeichnis überprüft und gefunden Die Quelldateien befinden sich tatsächlich zusammen mit den DCUs in Unterordnern. Ich werde versuchen, was Sie vorschlagen und sehen, ob ich es nicht vernünftig Verhalten kann. Danke, ich wünschte, ich könnte dir ein Bier kaufen! –

+1

Ich habe gerade meine zweideutige Verwendung von "included" in der ursprünglichen Post bemerkt - ich hätte sagen sollen, dass diese nur in dem Umfang enthalten waren, in dem sie in den "Uses" -Abschnitten meiner Einheiten referenziert wurden und nicht, dass ich das physisch festhielt Quellen in meinem Projekt. Genauso, ich denke, es waren tatsächlich die Streunerquellen in dem Bin-Ordner, die Delphi aus der Unterwelt grub, um sie zu durchforsten. Ich muss diesen an einer kurzen Leine behalten, was? –

3

Eine weitere Methode besteht darin, die Debug-Informationen und die Compiler-Direktiven für lokale Symbolinformationen zu verwenden - fügen Sie am Anfang jeder Einheit {$D-$L-} hinzu.

Dies unterdrückt IMMER die Erzeugung von Debug-Informationen für diese Einheit. Wenn Sie den Code nachverfolgen müssen, müssen Sie die Anweisungen auskommentieren.

+1

Kein schlechter Vorschlag - Ich habe dies für Dateien in meinen eigenen Projekten getan, aber in diesem Fall mit Komponentenbibliotheken kann es eine Menge von Quelldateien sein, um hineinzugehen und zu bearbeiten, besonders wenn die Aufrufe zu bereits kompilierten Einheiten gehen sollten in der IDE installiert. Ich denke Rob hat es mit den Streunerquellen im Bett mit meinen DCUs auf den Kopf getroffen. –

+0

@Justin: Vielleicht können Sie es einfach zu den wenigen machen, die Sie zu 98% der Zeit finden. – lkessler

+0

@Justin, @lkessler - das ist, was ich mit dem "98%" selbst tue, aber ich habe nur eine kleine Anzahl von 3rd-Party-Komponenten verwendet –

4

Nur um Ihre Optionen zu vervollständigen: Wenn Ihre Bibliotheken aus irgendeinem Grund mit Debug-Informationen kompiliert werden müssen (ich benutze normalerweise alles mit Debug-Informationen, einschließlich der VCL und RTL) und Sie versehentlich in eine Methode verfolgen, die Sie nicht interessiert Sie können Shift + F8 verwenden, bis die Methode zu Ihrem Code zurückkehrt.