如果您在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
您可以在project -> Options... -> Compiling
对话框中更改调试设置。
[]调试器是否查询指针所持有的接口?
调试器不会在运行时调用您的代码来确定变量的类型。实际上,除非您明确告知,否则它不会调用您的任何代码。
如果这样做的话,那将是不好的,因为可能会有副作用。
评估您的代码
如果希望调试器调用代码,则可以使用Evaluate/modify
选项或监视列表来强制其调用。
评估/修改Evaluate
是一次评估。
手表
选择:debug -> add watch at cursor
。
在浏览代码时,Watch
会跟踪您的表达式。
您可以通过右键单击监视项目并选择edit watch...
来编辑监视列表中的表达式。
在这里,您还可以强制调试器调用函数。