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

8
我遇到了一个Win64调试问题,看起来我们“丢失”了调试信息。所以我做了一些研究,并重新创建了我们旗舰产品的所有.dproj文件。这有所帮助,因为我恢复了我的“丢失”的蓝色小球。

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

同时请检查链接的截图,这应该更加清楚。

相关编译器选项

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

版本信息:

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

我尝试了许多调试设置的组合,但问题仍然存在于我的系统中。

我的同事电脑上的代码出现了完全相同的问题,因此至少可以有信心地重现这个问题。当尝试使用带有运行时bpl的小项目来重现时,似乎不会出现该问题,或者我无法重现它。因此,我没有发布此源代码。

当然,这里有一个或多个问题:

  • 还有其他人遇到过这个问题吗?
  • 找到解决方案了吗? - 请分享!
  • 没有找到解决方案? -> 请添加评论/投票支持此问题

我很想添加一些图片以澄清,但不幸的是我的声望还不够高。所以我只能添加图片链接,对此很抱歉。

  • 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

显而易见,也可能是最相关的选项是在“Delphi编译器->编译”选项卡下的“堆栈帧”。你打开了吗?如果你可以在调用堆栈中较低的某个例程中设置一些断点,然后跟踪代码直到调用堆栈开始出现错误。然后你可以检查是否有什么影响它并可能混淆调试器的堆栈遍历。 - Stefan Glienke
在调用TfrmNewAnalyses.Create之前,堆栈跟踪是正常的。一旦进入构造函数,堆栈帧就会被破坏。 - H.Hasenack
我已经添加了另一张截图。一旦执行移动指令0315D746,堆栈显示就会出现问题。 - H.Hasenack
典型的调试器故障通常是由编译器在序言中生成的某些代码引起的,导致调试器误解。您可以尝试在方法中注释掉语句,以查看是什么原因导致了这种情况,并在找到原因后可能以不同的方式编写它们。但我认为现在已经超出了SO的能力范围。 - Stefan Glienke
谢谢你的点赞! - H.Hasenack
显示剩余2条评论
1个回答

0
事实证明,这里发生了完全不同的事情。缺失的本地符号似乎是由于调试器未加载所有调试信息所致。
我创建了一个单元测试来加载运行时BPL。
当我从单元测试中运行我的表单(请查看问题中的截图),堆栈帧和本地符号会正确显示。
当我在我的相当大的应用程序中运行该表单时,完全相同的二进制BPL却没有显示本地符号和堆栈信息。奇怪的是,同一BPL中的其他单元实际上确实显示了正确的堆栈和本地变量信息,例如创建表单的单元直到创建表单的构造函数为止都是正常的。
因此,我猜测加载符号表时发生了某些情况。当我将调试设置更改为如屏幕截图所示(加载所有符号=关闭,并且仅为主BPL加载调试信息),我的堆栈和本地变量就会正确显示。在相同的二进制文件中。当我打开“为未指定的模块加载符号”时,我回到了旧的情况,缺少堆栈和本地符号。
因此,我怀疑调试器可以处理多少调试信息存在限制(真的吗?在64位模式下?),我好像记得很久以前Delphi 2..7调试时也有这种情况。
当然,这样做的时候我会缺少所有其他单元的调试信息,所以虽然这是一个答案,但它并不是最终解决方案。我将在 Embarcadero 网站上发布另一个问题和问题。

enter image description here


我在Embarcadero网站上找到了一个相关的问题,并且在那里提到你也可以使用通配符来加载符号表。这个方法非常有效,可以解决问题,而无需指定我所使用的每一个bpl文件。https://quality.embarcadero.com/browse/RSP-10080 - H.Hasenack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接