delphi - 使用运行时库的 Delphi 64 位调试有错误的堆栈帧处于活动状态
问题描述
我遇到了一个 Win64 调试问题,看起来我们“缺少”调试信息。所以我做了一些研究,并为我们的旗舰产品重新创建了所有 .dproj 文件。这有帮助,因为我找回了“丢失”的蓝色球。
但是现在我遇到了一个新问题:堆栈显示窗口中显示的(顶部)堆栈框架似乎是错误的,这导致局部变量不显示在局部变量窗格中,并且鼠标悬停在某个变量上方时也不显示. 但是当我选择我认为正确的堆栈框架时,局部变量窗口不再为空。将鼠标悬停仍然没有显示任何内容。
还要检查链接的屏幕截图,这应该可以更清楚地说明问题。
相关编译器选项
- 调试信息:调试信息
- 本地符号:真
- 堆栈帧:真
- 符号参考信息:参考信息
- 使用调试 dcus: False
- 使用导入的数据引用:True
- 链接器调试信息:真
- 包括远程调试符号:False
版本信息:
- RAD studio Enterprise 10.2.3 东京,内部版本 25.0.29899.2631
- 已安装 DDevExtension,已安装 IDEFixPack(卸载没有区别)
- 已安装 JCLDebug(卸载没有区别)
我玩过许多调试设置的组合,但问题仍然存在于我的系统上。
我的同事电脑在相同的代码中也有完全相同的问题,所以至少它可以放心地重现。当尝试使用运行时 bpl 的小项目重现此问题时,问题似乎没有发生,或者我无法重现它。因此,我没有为此发布的来源。
当然,这里有一个(是)问题: - 有没有其他人经历过这个?- 找到解决方案了吗?- 请分享!- 没有找到解决办法?-> 请为此问题添加评论/投票
我很想添加一些图片来澄清,但不幸的是我的声誉还不够高。所以我只能添加图片链接,抱歉。
解决方案
事实证明,这里发生了一些完全不同的事情。缺少本地符号似乎是由调试器未加载所有调试信息引起的。我创建了一个单元测试负载运行时 BPL。当我从单元测试中运行我的表单(检查有问题的屏幕截图)时,堆栈帧和本地符号会正确显示当我从我相当大的应用程序中运行表单时,完全相同的二进制 bpl 不会显示本地符号和堆栈信息。奇怪的是,同一 BPL 中的其他单元实际上确实显示了正确的堆栈和局部变量信息,例如,首先创建表单的单元在创建表单的构造函数的位置都可以。
所以我猜想加载符号表会发生一些事情。当我将调试设置更改为屏幕截图中显示的那样(Load All SYmbols=off, and onoy load debug info for main bpl),瞧,我的堆栈和局部变量正确显示。在同一个二进制文件中。当我打开“未指定模块的加载符号”时,我回到了缺少堆栈和本地符号的旧情况。
所以我怀疑调试器可以处理多少调试信息(真的?在64 位模式下?),我似乎记得很久以前的 Delphi 2..7 调试。
当然,这样做时我缺少所有其他单元的调试信息,所以虽然这是一个答案,但它不是最终解决方案。我将在 embarcadero 网站上提出另一个问题和问题。
推荐阅读
- javascript - 从脚本更改 href 的文本会使文本消失而不改变
- c++ - 如何为 std::array 中的 std::vectors 保留内存?
- c++ - STL 中的容器,类似于对,但有两个以上的数据元素
- mapbox-ios - 通过颜色特征属性设置 MGLFillStyleLayer 的 FillColor
- reactjs - 如何将 axios 数据加载为初始 redux 状态
- python-3.x - 如何在keras的自定义损失函数中调用全局变量来改变损失函数的返回值
- c# - 使用 Linq Select 时出现 ArgumentNullException
- c - 如何使用结构在 C 中使用函数指针?
- c# - 恢复数据库 PostgreSQL 重复行
- gmail-api - gmail过滤器中是否有选择转发和抄送地址的功能?