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

H.H*_*ack 7 delphi debugging win64 watch stack-frame

我遇到了Win64调试问题,看起来我们"缺少"调试信息.所以我做了一些研究,并为我们的旗舰产品重新创建了所有的.dproj文件.这有助于我将"失踪"的蓝球带回来.

但是现在我遇到了一个新问题:堆栈显示窗口中显示的(顶部)堆栈框架看起来是错误的,这导致局部变量不显示在局部变量窗格中,并且当鼠标悬停在某个变量上方时也不会.但是当我选择我认为正确的堆栈帧时,局部变量窗口不再是空的.悬停鼠标仍然没有显示任何内容.

还要检查链接的屏幕截图,这应该更清楚地说明事情.

相关的编译器选项

  • 调试信息:调试信息
  • 本地符号:正确
  • Stack Frames:真的
  • 符号参考信息:参考信息
  • 使用debug dcus:False
  • 使用导入的数据引用:True
  • 链接器调试信息:正确
  • 包括远程调试符号:False

版本信息:

  • RAD studio Enterprise 10.2.3 tokyo,build 25.0.29899.2631
  • 已安装DDevExtension,已安装IDEFixPack(卸载没有任何区别)
  • 安装JCLDebug(卸载没有区别)

我已经使用了许多调试设置组合,但问题仍然存在于我的系统上.

我的同事计算机在相同的代码中具有完全相同的问题,因此至少它可以自信地重现.当尝试使用带有运行时bpl的小项目重现此问题时,问题似乎不会发生,或者我无法重现它.因此,我没有任何来源可以释放.

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

我想添加一些图片来澄清,但不幸的是我的声誉还不够高.所以我只能添加图片的链接,对不起.

  • 源代码视图中的断点
  • 完整CPU视图中的断点
  • 选择子顶部堆栈帧
  • 甚至连一个更深,意想不到的堆叠顶部
  • 上一条指令导致堆栈显示被破坏

H.H*_*ack 0

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

所以我猜想加载符号表时发生了一些事情。当我将调试设置更改为屏幕截图中显示的(加载所有 SYmbols=off,并且 onoy 加载主 bpl 的调试信息)时,瞧我的堆栈和本地变量正确显示。在同一个二进制文件中。当我打开“加载未指​​定模块的符号”时,我回到了缺少堆栈和本地符号的旧情况。

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

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

在此输入图像描述