使用运行时库的 Delphi 64 位调试有错误的堆栈帧处于事件状态

标签 delphi debugging watch win64 stack-frame

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

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

另请检查链接的屏幕截图,这应该能更清楚地说明问题。

相关编译器选项

  • 调试信息:调试信息
  • 本地符号:True
  • 堆栈帧:True
  • 符号引用信息:引用信息
  • 使用调试 dcus:False
  • 使用导入的数据引用:正确
  • 链接器调试信息:True
  • 包含远程调试符号:False

版本信息:

  • RAD studio Enterprise 10.2.3 东京,版本 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

最佳答案

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

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

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

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

enter image description here

关于使用运行时库的 Delphi 64 位调试有错误的堆栈帧处于事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50811975/

相关文章:

delphi - 为什么编译器不能在我的包中包含外部 DCU?

javascript - Visual Studio 将 Javascript 调试与 Windows 10 Edge 集成

c - C 中的 6 位二进制计数器(编译,但 Windows 遇到错误)

使用输入文件进行 C++ lldb 调试

javascript - ECMA脚本 6 : watch changes to class properties

windows - 有没有办法跟踪来自 TComboBox 的滚动条消息?

delphi - TTimer.OnTimer 事件处理程序是可重入的吗?

刷新输出上的 linux watch 横幅

javascript - 在 "independent"变量上使用 Object.watch()?

Delphi-回调错误代码