【问题标题】:Tstrings Visualizer in XE2 only displaying 17 items [duplicate]XE2中的Tstrings Visualizer仅显示17个项目[重复]
【发布时间】:2015-12-31 15:38:46
【问题描述】:

在下图中,我在一个断点上循环遍历 TStrings 的 (196) 个元素。当前指数为 193。

Visualizer 仅显示 17 个元素。

对此有什么办法吗(除了专门检查元素“x”)?

【问题讨论】:

  • 我认为可视化工具的工作方式是调试器对每个检查的表达式都有一些固定的缓冲区大小,而您看到的是有多少行适合 2k 或 4k 字节,这是调试器中可视化功能的限制。如果他们添加了一些向上/向下箭头或与事物交互的方式,也许他们可以让您滚动浏览更多数据。
  • @Warren 明年我会检查一下 ;-) 使用较短的字符串
  • 由于您可以编写自己的可视化工具,因此您可以添加此类箭头,并使用不同的控件来显示内容。

标签: delphi ide delphi-xe2


【解决方案1】:

据我所知,除了提交功能请求(如果成功则升级)之外,您对此无能为力。我猜这就是被截断的东西,就像 WarrenP 暗示的那样,是提供给可视化器的数据的大小,而不是 TStrings 对象中的特定行数。这就是为什么我认为:

假设 XE2 带有与更高版本 XE 相同的示例调试器可视化工具,您 可以试试这个:

  1. 如果您在 IDE 中安装了 Embarcadero Sample Visualizers 软件包,请卸载它。

  2. 将 StringListVisualizer.Pas 单元复制到方便的地方。

  3. 创建一个新的 .Dpk 项目并将复制的 StringListVisualizer.Pas 添加到其 包含列表;它的 Requires 列表应该包括 Rtl 和 DesignIDE。

  4. 打开复制的 StringListVisualizer.Pas 并找到例程

    function TStringListViewerFrame.Evaluate(Expression: string): string;

你会看到它的本地变量包括

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

将 4095 更改为 32767。这样做的目的是确保 由于此缓冲区的大小,Strings Visualizer 显示不会被截断, 根据 WarrenP 的评论。事实上,导致你的截断 问题似乎出在其他地方。

  1. 在 StringListVisualizer.Pas 中,将调试器断点放在行上

      case EvalRes of
    

      if not FDeferredError then

function TStringListViewerFrame.Evaluate(Expression: string): string.

您需要 2 个断点,因为Evaluate 可以通过两种方式完成, 取决于 EvalRes 的值。它总是为我返回 erDeferred。

  1. 编译并运行您的 Dpk 项目。它将调用 IDE 的第二个实例。

  2. 在第二种情况下,加载并运行您的问题项目。当您的断点在该行程中时,右键单击 Watches 窗口并转到 Visualizers |显示字符串。

  3. StringListVisualizer.Pas 中的一个或另一个断点很快就会跳闸 评估给你带来麻烦的字符串属性(它可能会绊倒 首先要评估的其他几个表达式。当它这样做时,单步到函数 TStringListViewerFrame.Evaluate 的结果被分配的地方,然后评估

    Length(Result)

Copy(Result, Length(Result) - 100, Length(Result))

使用我的测试数据,我得到 Length(Result) 的值为 4101,并且 Copy 计算到字符串 .text 的最后一部分,就在其显示之前 在可视化工具中被截断。

从这些结果(至少在我的情况下,ymmv)中似乎相当清楚,数据截断发生在为可视化器提供数据的调试器机器中的某处,而不是在可视化器本身中。比我更了解调试器内部结构的人可能会提出另一种将未截断数据提供给可视化器的方法。

更新:一些想法:

  1. 对于可视化器可用的明显“4k”截断的解决方法可能是链接到正在调试的应用程序一个函数,我们称之为TStringsPagedWindow(Input : TStsrings; Page : Integer) : String,它有望返回 TStrings 对象的一部分解决“4k”限制,代价是需要在 Watch Window 中观看它,而不是 TStrings 对象本身,指定 Page 值。显然这不会非常方便,并且需要将TStringsPagedWindow 函数链接到正在调试的可执行文件中。

  2. 从 1. 开始,看到调试器可视化器显然可以评估 任何 有效表达式,可以设想(在可视化器中)基于 TStrings 变量的名称构造一个表达式被监视并自动调用TStringsPagedWindow 来填充可以显示其内容的GUI 对象。这是我目前能想到的最接近 WarrenP 的建议“既然你可以编写自己的可视化工具,你可以添加这样的箭头,并使用不同的控件来显示内容。”也许相当多的工作,但我对乐趣的看法;如果有兴趣,也许我会去。

【讨论】:

  • 被截断的内容......是提供给可视化器的数据的大小” - 可视化器本身,而不是馈送器,决定要检索多少数据。默认的TStrings 可视化工具(参见$(BDS)\source\Visualizers\StringListVisualizer.pas)在评估TStrings 数据时使用固定大小的4K 缓冲区。有第 3 方 TStrings 可视化工具在周围浮动,消除了该限制。
  • @RemyLebeau:在这种情况下,在 StringListVisualizer.Pas 中的哪个位置指定了固定缓冲区大小?正如我在回答中所说,在(Xe4 版本的)单元中指定的唯一可以明显更改的缓冲区大小没有任何区别(我尝试将其更改为 0..32767 或介于两者之间的任何值) - 见第 4 点 - 不避免 4k 截断。
  • 在调用调试器的IOTAThread.Evaluate()方法时,TStringListViewerFrame.Evaluate()方法(ResultStr: array[0..4095] of Char)内部有一个固定的缓冲区。
  • @RemyLebeau:我说的是正是,而且就像我说的,改变它似乎没有任何区别。
  • 经过进一步研究,显然IOTAThread.Evaluate()本身有12K的限制。但是有一些方法可以解决这个问题。我刚刚将这个问题联系起来的答案解释了实现它的一种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多