2016-04-02 9 views
4

Wenn Sie einen Schnittstellenzeiger in Delphi Evaluate/Modify Pop-up (Strg-F7) inspizieren es wird sagen so etwas wie dieses:Delphi-Debugger-Funktionen mit Schnittstellenzeiger

Pointer ($ 656E84) als IConnectionPoint

Meine Frage ist, wo bekommt der Debugger den "as IConnectionPoint" oder was auch immer von,

a) Wie weiß es, welche Art von Schnittstelle der Zeiger referenziert; und

b) Woher (und durch welchen Prozess) erhält der Debugger den Text seiner Beschreibung, z. IConnectionPoint?

Ich fragte mich, ob der Debugger diese Dinge verwaltet, indem er irgendwie die Schnittstelle abfragt, die der Zeiger hält. Aber, IInterface (was ist, was der Debugger meldet eine IUnknown als) hat nur QueryInterface, _AddRef und _Release methods und ich kann nicht sehen, wie die Informationen von jedem von denen erhalten werden konnte. Genauso kann ich nicht sehen, wie der Debugger die Informationen aus dem "history" des Zeigers ableiten könnte, weil das Objekt, auf das verwiesen wird, nicht erst in der Delphi-App erstellt worden sein muss.

+2

Ist es nicht so einfach wie der Debugger die Variable zu wissen, wird deklarierten Typ X zu haben und zu wissen, es hat einen Wert Y, so „Pointer (Y) als X“ angezeigt wird? –

+1

Können Sie den Code veröffentlichen, der den Schnittstellenzeiger deklariert, der Ihnen das beobachtete Verhalten bietet? Ich vermute (genau wie @Rob), dass der Debugger einfach von den kompilierten Symbolen wissen kann, wie die Variable deklariert wurde. –

Antwort

4

Woher weiß es, welche Art von Schnittstelle der Zeiger referenziert?

Der Debugger hat Zugriff auf Debugging-Informationen.

Woher (und mit welchem ​​Prozess) erhält der Debugger den Text seiner Beschreibung?

Aus einer separaten Datei, die vom Compiler erstellt wurde (normalerweise eine .map Datei).
Der Compiler kann auch die Debug-Informationen in der Exe selbst enthalten. Aus diesem Grund ist eine Debug-Exe wesentlich größer als eine Release-Exe.

Variablen werden in der (enthaltenen) Kartendatei/Ressource definiert.
Die Debug-Info verknüpft auch den Assembly-Code mit Zeilen in der Quelldatei.
So weiß der Debugger, welche Quellzeile Sie ausführen; Es kennt die Adresse, unter der sich die CPU befindet, und sucht diese Adresse in der Datei .map nach der Zeilennummer und dem Namen der Quelldatei.

Sie können den Linker (den Prozess, der alle dcu und andere Dateien in eine EXE-Datei zusammenfasst) entweder die Debug-Informationen in die EXE aufnehmen oder eine separate .map-Datei erstellen.
Project-> options -> Linking

enter image description here

Sie können die Debug-Einstellungen im project -> Options... -> Compiling Dialog verändern.

enter image description here

[ist] der Debugger [...] abfragen, um die Schnittstelle der Zeiger hält, ist?

Der Debugger tut nicht Ihren Code aufrufen, um die Typen von Variablen zur Laufzeit zu bestimmen. In der Tat ruft es keinen Code auf, es sei denn, Sie sagen es ausdrücklich.
Wenn es das wäre, wäre das wegen möglicher Nebenwirkungen schlecht.

Auswertung Code
Wenn Sie den Debugger wollen Ihren Code aufrufen können Sie es zwingen, dies zu tun, indem Sie die Evaluate/modify Option oder die Merkliste verwenden.

Auswerten/Ändern
Evaluate eine einmalig Auswertung ist.

enter image description here

Uhren
wählen: debug -> add watch at cursor. Die Watch verfolgt Ihren Ausdruck, während Sie durch den Code gehen. Sie können die Ausdrücke in der Beobachtungsliste bearbeiten, indem Sie mit der rechten Maustaste auf das Beobachtungselement klicken und edit watch... auswählen. Hier können Sie auch den Debugger zum Aufruf Ihrer Funktionen zwingen.

enter image description here

+0

Der Aufrufcode ist genau das, was der Evaluate/Modify-Dialog ist. –