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

时间:2018-06-12 07:53:13

标签: delphi debugging watch win64 stackframe

我遇到了一个Win64调试问题,看起来我们已经"缺少"调试信息。所以我做了一些research并为我们的旗舰产品重新创建了所有的.dproj文件。这有帮助,因为我得到了我的失踪"蓝球回来了。

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

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

相关编译器选项

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

版本信息:

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

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

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

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

添加评论/投票

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

  • Breakpoint in source code view
  • Breakpoint in Full CPU view
  • Select sub-top stackframe
  • Going even one lvl deeper, unexpected stack top
  • The previous instruction caused the stack display to get mangled

1 个答案:

答案 0 :(得分:0)

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

因此,我猜测加载符号表时发生了某些事情。而且,当我将调试设置更改为屏幕截图中所显示的(Load All SYmbols = off,并为主要bpl加载了onoy调试信息)时,请确保我的堆栈和局部变量正确显示。在相同的二进制文件中。当我打开“为未指定模块加载符号”时,我回到了缺少堆栈和本地符号的旧情况。

所以我怀疑调试器可以处理多少调试信息(在 64bit模式下真的真的 ??)存在一定的限制,我似乎很早就记得Delphi 2..7调试。

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

enter image description here