Delphi 使用运行时库的 64 位调试有错误的堆栈帧活动

Delphi 64 bit debugging using runtime libs has wrong stack frame active

我 运行 遇到一个 Win64 调试问题,看起来我们是 "missing" 调试信息。所以我做了一些 research 并为我们的旗舰产品重新创建了我所有的 .dproj 文件。这很有帮助,因为我拿回了我的 "missing" 蓝球。

但是现在我运行陷入了一个新的问题:stack display window中显示的(top)stack frame好像是错误的,导致局部变量在local中没有显示变量窗格,也不是将鼠标悬停在某个变量上方时。但是当我 select 我认为正确的堆栈框架时,局部变量 window 不再为空。将鼠标悬停仍然没有任何显示。

同时检查链接的屏幕截图,这应该会更清楚地说明事情。

相关编译器选项

版本信息:

我试过多种调试设置组合,但问题仍然存在于我的系统上。

我的同事计算机在相同的代码中有完全相同的问题,所以至少它是可以重现的。当尝试使用 运行time bpl 的小项目重现此问题时,问题似乎没有发生,或者我无法重现它。因此,我没有为此发布的来源。

当然还有一个(是)问题: - 还有其他人经历过吗? - 找到解决方案了吗? - 请分享! - 没有找到解决方案? -> 请为此添加 comment/vote issue

我很想添加一些图片来澄清,但不幸的是我的声誉还不够高。所以只能给图片加链接了,不好意思。

事实证明这里发生了一些完全不同的事情。丢失的本地符号似乎是由调试器未加载所有调试信息引起的。 我已经创建了一个单元测试来加载 运行time BPL。 当我在单元测试中 运行 我的表单(检查有问题的屏幕截图)时,stackframes 和本地符号显示正确 当我 运行 来自我相当大的应用程序中的表单时,完全相同的二进制 bpl 不会显示本地符号和堆栈信息。奇怪的是,同一个 BPL 中的其他单元实际上确实显示了正确的堆栈和局部变量信息,例如,首先创建表单的单元在创建表单的构造函数之前是可以的。

所以我猜加载符号 table 时发生了一些事情。当我将调试设置更改为屏幕截图中显示的设置时(加载所有符号 = 关闭,并且只加载主要 bpl 的调试信息),瞧,我的堆栈和局部变量显示正确。在同一个二进制文件中。当我打开 "load symbols for unspecified modules" 时,我回到了缺少堆栈和局部符号的旧情况。

所以我怀疑调试器可以处理多少调试信息是有限制的(真的?在64位模式?),我似乎记得很久以前 Delphi 2..7 调试。

当然,这样做时我缺少所有其他单元的调试信息,因此虽然这是一个答案,但它不是最终解决方案。我将在 embarcadero 网站上发布另一个 question 并发布。