Delphi调试器与接口指针的能力

4
如果您在Delphi的“Evaluate/Modify”弹出窗口(Ctrl-F7)中检查接口指针,它将显示类似于以下内容的内容:
Pointer($656E84) as IConnectionPoint
我的问题是,调试器从何处获得“as IConnectionPoint”或其他信息,即
a)它如何知道指针正在引用哪种类型的接口; 和
b)调试器从何处(以及通过什么过程)获取其描述文本的文本,例如IConnectionPoint?
我想知道调试器是否通过某种方式查询指针持有的接口来管理这些内容。但是,“IInterface”(调试器报告的“IUnknown”)只有QueryInterface,_AddRef和_Release方法,并且我无法看到信息可以从中获取。同样,我无法看到调试器如何从指针的“历史记录”中推导出信息,因为引用的对象可能根本没有在Delphi应用程序中创建。

2
调试器知道变量声明为类型X,且其值为Y,因此显示“指针(Y)作为X”,难道不是这么简单吗? - Rob Kennedy
1
你能否发布声明接口指针的代码,以便我们了解你观察到的行为?我怀疑(就像@Rob一样)调试器可以从编译后的符号中知道变量的声明方式。 - Ken White
1个回答

5

它如何知道指针引用的接口类型?

调试器可以访问调试信息。

调试器是通过什么过程获取其描述文本的?

从编译器创建的单独文件(通常是 .map 文件)中获取。
编译器还可以将调试信息包含在可执行文件本身中。这就是为什么调试版可执行文件比发布版要大得多的原因。

变量在(包含的)映射文件/资源中定义。
调试信息还将汇编代码链接到源文件中的行。
这就是调试器知道您正在执行哪个源行的方式;它知道 CPU 所在的地址,并在 .map 文件中查找该地址以查找行号和名称源文件。

您可以要求链接器(将所有 dcu 和其他文件组合成一个 exe 的过程)将调试信息包含在 exe 中或创建单独的 .map 文件。
项目 -> 选项 -> 链接

enter image description here

您可以在项目 -> 选项... -> 编译对话框中更改调试设置。

enter image description here

调试器是否会查询接口指针所持有的内容?

调试器不会在运行时调用您的代码以确定变量类型。实际上,除非您明确告诉它这样做,否则它不会调用您的任何代码。
如果这样做可能会产生副作用,那么这将是不好的。

评估您的代码
如果您希望调试器调用您的代码,则可以使用Evaluate/modify选项或监视列表来强制执行。

评估/修改
Evaluate是一次性评估。

enter image description here

手表
选择:调试 -> 在光标处添加观察观察会在您逐步执行代码时跟踪您的表达式。 您可以通过右键单击观察项目并选择编辑观察...来编辑观察列表中的表达式。
在这里,您还可以强制调试器调用您的函数。

enter image description here


调用代码正是“评估/修改”对话框的用途。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接