如果您在Delphi的Evaluate/Modify弹出窗口(Ctrl-F7)中检查接口指针,它将说出类似以下内容:


  指针($ 656E84)作为IConnectionPoint


我的问题是,调试器从何处获得“ as IConnectionPoint”或其他任何信息

a)如何知道指针所引用的接口类型;和

b)调试器在哪里(以及通过什么过程)获得其描述文本,例如IConnectionPoint

我想知道调试器是否通过某种方式查询指针所持有的接口来管理这些事情。但是,IInterface(调试器将其报告为IUnknown的内容)仅包含QueryInterface_AddRef_Release methods,我看不到如何从任何这些信息中获取信息。同样,我看不到调试器如何从指针的“历史记录”中获取信息,因为首先不需要在Delphi应用程序中创建其引用的对象。

最佳答案

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


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


  调试器从哪里(通过什么过程)获得其描述文本?


由编译器创建的单独文件(通常为.map文件)。
编译器还可以在exe本身中包含调试信息。这就是为什么调试exe大于发行版exe的原因。

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

您可以要求链接器(将所有dcu和其他文件放到exe文件中的过程)在exe文件中包含调试信息或创建一个单独的.map文件。
Project-> options -> Linking

delphi - 带接口(interface)指针的Delphi调试器功能-LMLPHP

您可以在project -> Options... -> Compiling对话框中更改调试设置。

delphi - 带接口(interface)指针的Delphi调试器功能-LMLPHP


  []调试器是否查询指针所持有的接口?


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

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

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

delphi - 带接口(interface)指针的Delphi调试器功能-LMLPHP

手表
选择:debug -> add watch at cursor
在浏览代码时,Watch会跟踪您的表达式。
您可以通过右键单击监视项目并选择edit watch...来编辑监视列表中的表达式。
在这里,您还可以强制调试器调用函数。

delphi - 带接口(interface)指针的Delphi调试器功能-LMLPHP

10-08 04:48