【问题标题】:How can I increase the size of the string that an external debugger visualizer can display?如何增加外部调试器可视化器可以显示的字符串的大小?
【发布时间】:2012-03-01 17:19:40
【问题描述】:

我再次编写了一个外部调试器可视化工具,但我遇到了麻烦。调试器可视化器可以返回的字符串大小似乎有限制。

Delphi 2010 附带的 TStrings 调试器可视化工具有 4K 的限制。在回答 Embarcadero 新闻组上发布的问题时,Ewe Schuster replied 说:“您可以稍微增加缓冲区,但 AFAIR 实际限制在 IOTAThread.Evaluate 中,限制约为 12k 字符。”

我的调试器可视化器是基于TStrings调试器可视化器的代码,可以看到TFrame的Evaluate方法的实现包括了ResultStr的如下声明,用于返回IOTAThread.Evaluate调用返回的字符串:

  ResultStr: array[0..4095] of Char;

我曾希望增加此缓冲区的大小会有所帮助,但没有运气。

如果有的话,我可以做些什么来增加我的外部调试器可视化器可以显示的字符串的大小?

【问题讨论】:

  • 作为一种解决方法,您可以为 PString 创建一个可视化工具吗?

标签: delphi delphi-2010 delphi-xe delphi-xe2 debuggervisualizer


【解决方案1】:

我对这个限制也有同样有限的耐心...... 所以我制作了一个调试可视化器,主要通过在调试过程中创建一个 MemoryStream 来保存表达式的字符串结果,然后使用类似

的东西来解决这个限制
CurProcess.ReadProcessMemory(StrToInt(SrcMemoryAddr), DstMemStream.Size, DstMemStream.Memory^);

将其复制到可视化工具的 MemoryStream 中。然后你可以做任何你想显示的事情(例如,如果它是像 CLientDataSet.XMLData 这样的 XML 字符串,则格式化它以供人类阅读)。

根据表达式是 const 字符串、var 还是需要求值等,有一些技巧......

我的 FGStringVisualizer 不是 100% 令人满意,这就是为什么我还没有在我的博客上发布它,但因为它完成了我需要的 99% 的工作,所以我没有花时间清理它并发布它甚至“原样”。但如果有需要,我当然可以用所有需要的免责声明来做到这一点......

更新: 这与我在上次 DelphiLive 中提出的 FGStringListVisualizer 中使用的想法相同。顺便说一句,这个也可能值得放在我的博客上,因为我做了一些改进。

【讨论】:

  • 太棒了。非常感谢你。但是,我并不完全理解答案。我使用 CurProcess 来获取 CurrentThread,然后在 CurrentThread 上调用 Evaluate 来获取表达式的值(在我的例子中是一个字符串)。您提供的代码如何适用于这个等式。您的 ScrMemoryAddr 变量是 Evaluate 的 out ResultAddr 参数吗?以及您的可视化工具的 TMemoryStream 的 DstMemStream?
  • 我调用 Evaluate 在 CurProcess 中创建 MemoryStream:if not Evaluate(DebugSvcs, CurProcess, CurThread, 'NativeInt(TMemoryStream.Create)', SrcMemStreamAddr)then。然后我再次使用Evaluate 将字符串放入其中:if not Evaluate(DebugSvcs, CurProcess, CurThread, 'TMemoryStream(' + SrcMemStreamAddr + ').Write((' + FExpression + '), Length(' + FExpression + ')*SizeOf(Char))', CurSizeResult) then...根据表达式的性质,这就是它变得模糊的地方...
  • 请原谅我的无知,但我找不到将 IOTADebuggerServices、IOTAProcess 和 IOTAThread 作为前三个参数的 Evaluate 方法。这是您编写的自定义方法吗?如果没有,我会在哪个界面找到这个版本的 Evaluate?
  • 你是对的。它基于 Delphi 示例 (TStringListViewerFrame.Evaluate),但我将 DebugSvcs、CurProcess 和 CurThread 移出其范围以重用它们...
  • 非常感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多