Delphi XE2中的Tstrings可视化工具仅显示17项

Delphi XE2中的Tstrings可视化工具仅显示17项,delphi,ide,delphi-xe2,Delphi,Ide,Delphi Xe2,在下面的图片中,我在一个断点上,通过一个TStrings的(196)个元素循环。目前的指数是193 可视化工具仅显示17个元素 对此可以做些什么(除了专门检查元素“x”之外) 据我所知,除了提交功能请求(如果成功升级)之外,您对此无能为力。我猜这是被截断的,就像WarrenP暗示的那样,是被送入可视化工具的数据的大小,而不是TStrings对象中的特定行数。这就是为什么我认为: 假设XE2与更高版本的XE具有相同的示例调试器可视化工具,那么 你可以试试这个: 如果在IDE中安装了Embarcad

在下面的图片中,我在一个断点上,通过一个TStrings的(196)个元素循环。目前的指数是193

可视化工具仅显示17个元素

对此可以做些什么(除了专门检查元素“x”之外)


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

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

  • 如果在IDE中安装了Embarcadero示例可视化工具包,请卸载该包

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

  • 创建一个新的.Dpk项目,并将复制的StringListVisualizer.Pas添加到其 包含列表;its需求列表应包括Rtl和DesignIDE

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

    函数TStringListViewerFrame.Evaluate(表达式:string):string

  • 您将看到它的本地变量包括

      ResultStr: array[0..4095] of Char;
    
    将4095更改为32767。这样做的目的是确保 字符串可视化工具显示不会因为此缓冲区的大小而被截断, 根据沃伦普的评论。事实上,导致您的 问题似乎在别处

  • 在StringListVisualizer.Pas中,在行上放置调试器断点

      case EvalRes of
    
  • 在函数TStringListViewerFrame.Evaluate中(表达式:string):string

    您需要2个断点,因为有两种方法可以完成
    求值
    , 取决于评估值。对我来说,它总是会回来

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

  • 在第二个实例中,加载并运行问题项目。当您在其中的断点跳闸时,右键单击Watches窗口并转到Visualizers | Show Strings

  • 很快,StringListVisualizer.Pas中的一个或另一个断点将跳闸 评估给您带来麻烦的strings属性(它可能会在 要首先计算的其他几个表达式。当它这样做时,只需将函数TStringListViewerFrame.evaluate的结果分配到指定的位置,然后进行计算

    长度(结果)

  • 使用我的测试数据,我得到一个长度(Result)值4101,并且 Copy计算结果为strings.text的最后一部分,就在其显示之前 在可视化工具中,将被截断

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

    更新:一些想法:

  • 可视化工具可用的明显的“4k”截断的解决方法可能是链接到正在调试的应用程序中一个函数,让我们称它为
    TStringsPagedWindow(输入:TStsrings;Page:Integer):String
    ,它返回一个TStrings对象的一部分,希望围绕“4k”工作限制,以需要在监视窗口中监视它(而不是TStrings对象本身)为代价,指定页面值。显然,这并不十分方便,并且需要将
    TStringsPagedWindow
    函数链接到正在调试的可执行文件中


  • 从1开始,鉴于调试器可视化工具显然可以计算任何有效表达式,因此可以设想(在可视化工具中)构造一个基于正在监视的TStrings变量名称的表达式,并自动调用
    TStringsPagedWindow
    来填充一个可以显示其内容的GUI对象。这是目前我能想到的最接近WarrenP建议的表达式“既然你可以编写自己的可视化工具,那么你就可以添加这样的箭头,并使用不同的控件来显示内容。”可能需要做很多工作,但我的想法很有趣;如果有兴趣,也许我可以试一试


  • 我认为可视化工具的工作方式是,调试器对每个已检查的表达式都有固定的缓冲区大小,您看到的是有多少行适合2k或4k字节,这是调试器中可视化工具功能的一个限制。如果他们添加了一些上下箭头或与之交互的方式,也许他们可以让您可以滚动查看更多数据。@Warren我将在明年检查;-)使用更短的字符串,您可以编写自己的可视化工具,您可以添加这样的箭头,并使用不同的控件显示内容。“正在截断的内容。。。是馈送到可视化工具的数据的大小”-可视化工具本身而不是馈送器决定要检索的数据量。默认的
    TStrings
    可视化工具(请参见
    $(BDS)\source\Visualizers\StringListVisualizer.pas
    )在评估
    TStrings
    数据时使用固定大小的4K缓冲区。有第三方
    TStrings
    可视化工具可以消除该限制。@RemyLebeau:在这种情况下,在StringListVisualizer.Pas中指定了固定缓冲区大小吗?正如我在回答中所说,在(Xe4版本的)可以明显更改的单元没有任何区别(我尝试将其更改为0..32767或两者之间的任何值)-参见第4点-但没有避免4k截断。
    TStrin中有一个固定的缓冲区
    
          if not FDeferredError then
    
    Copy(Result, Length(Result) - 100, Length(Result))