【问题标题】:Delphi debugger capabilities with interface pointers带有接口指针的 Delphi 调试器功能
【发布时间】:2016-04-02 14:01:28
【问题描述】:

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

Pointer($656E84) 作为 IConnectionPoint

我的问题是,调试器从哪里获得“as IConnectionPoint”或其他任何东西,iow

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

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

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

【问题讨论】:

  • 难道不是调试器知道变量被声明为X类型,知道它的值为Y,所以显示“Pointer(Y) as X”那么简单吗?
  • 你能发布声明接口指针的代码吗?它给你你观察到的行为?我怀疑(就像@Rob)调试器可以简单地从编译符号中知道变量是如何声明的。

标签: delphi debugging pointers delphi-7


【解决方案1】:

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

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

调试器在哪里(以及通过什么进程)获取其描述文本?

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

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

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

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

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

调试器在运行时调用您的代码来确定变量的类型。事实上,除非您明确告诉它这样做,否则它不会调用您的任何代码。
如果这样做会很糟糕,因为可能会产生副作用。

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

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

手表
选择:debug -> add watch at cursorWatch 在您逐步执行代码时跟踪您的表情。 您可以通过右键单击监视项并选择edit watch...来编辑监视列表中的表达式
您还可以在此处强制调试器调用您的函数。

【讨论】:

  • 调用代码正是评估/修改对话框的用途。
猜你喜欢
  • 2018-03-04
  • 2012-08-28
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多