ghc调试是对Haskell程序执行精确堆分析的调试工具(查看我们的上一篇介绍它的帖子)。工作时擦除分析,我们抓住机会赚了很多需要改进和改善生活质量ghc调试图书馆和ghc-调试块终端用户界面。

总之,

  • ghc调试现在可以无缝地处理已分析的可执行文件。
  • 这个ghc-调试块UI已经围绕可组合、基于过滤器的工作流进行了重新设计。
  • 现在可以使用库检查成本中心和其他分析元数据接口和TUI。
  • 终端界面中集成了更多分析模式,如2级配置文件。

这篇文章探讨了这些变化和检查的新可能性它们启用的Haskell进程堆。这些更改可用通过使用0.6.0.0的版本ghc-debug-子ghc-调试块

回顾:使用ghc调试

使用时通常涉及两个过程ghc调试在直播节目中。第一个是调试对象进程,这是要检查其堆的进程。调试对象进程与ghc-debug-子包裹。这个ghc-debug-子包提供包装器函数

带GhcDebug:: IO(输入输出)-> IO(输入输出)

你把你的主要的函数启用ghc调试。此包装打开unix套接字并回答有关调试对象进程堆的查询,包括传输有关调试对象的各种元数据,例如编译调试对象时使用的ghc版本,以及组成堆上各种对象的实际位。

第二个是调试器进程,它通过套接字查询调试对象机制,并解码响应以重建被调试对象的视图哈斯克尔堆。人们使用的最常见的调试器是ghc-调试块,其中提供用于与调试对象进程交互的TUI。

这是一个重要的原则ghc调试调试器和调试对象没有需要使用彼此相同的GHC版本进行编译。换句话说,一次编译的调试器可以灵活地与许多不同的调试人员一起工作。使用我们最新的更改调试器现在可以与已分析的可执行文件无缝协作。

TUI改进

探索TUI中的成本中心堆栈

为了调试已分析的可执行文件,我们添加了对解码的支持中的配置信息ghc调试库。添加解码支持后,很容易显示TUI中每个关闭的相关成本中心堆栈信息,允许您交互式地探索成本链具有导致分配特定闭包的源位置的中心。这将为您提供与调用全球总部。Stack.who创建功能对一个闭包,但对堆上的每个闭包!此外,ghc-调试块允许您搜索已经在特定成本中心下分配。

查看特定列表关闭的成本中心堆栈

正如我们在eras分析博客帖子,对象地址根据分配的年代进行着色。

擦除配置,每个时代都有不同的颜色

如果启用了其他分析模式,如固定器分析或传记分析,然后,这些模式跟踪的额外单词被用来用绿线标记使用过的闭包。

简介,使用过的封口标记为绿色

基于筛选器的工作流

典型ghc-调试块工作流将包括连接到客户端流程或快照,然后运行查询(如搜索)来跟踪您感兴趣。这采用了中可用的各种搜索命令的形式用户界面:

ghc-debug-brick中现在可用的命令

然而,有时您希望组合多个搜索命令,以便更精确地缩小你感兴趣的确切对象必须通过使用ghc调试哈斯克尔API或修改ghc-调试块代码本身支持您的自定义查询。

过滤器提供了一个可组合的工作流,以便执行更高级的查询。您可以从可能的筛选器列表中选择要应用的筛选器,如构造函数名称、闭包大小、纪元等,并将其添加到当前过滤器堆栈进行自定义搜索查询。每个过滤器也可以反转。

ghc-debug-brick中可用的过滤器

在实现了对eras评测的支持后,我们有动力添加此功能因为将现有查询与按时代筛选相结合通常很有用。使用这些过滤器,可以轻松表达您自己的特定于域的查询,例如:

  • 查找在特定时代分配的施工人员。
  • 查找全部箭头大于1000字节的闭包。
  • 让我看看这个时代留下的一切,除了箭头格雷建造师。

以下是当前可用过滤器的完整列表:

姓名 输入 例子 行动
地址 结束地址 0x421c3d93c0 找到带有特定地址的闭包
信息表 信息表地址 0x1664ad70 查找具有特定信息表的所有闭包
施工单位名称 施工单位名称 箱子 查找具有给定构造函数名称的所有闭包
闭包名称 闭包名称 状态_存储J_信息 查找具有特定闭包名称的所有闭包
时代 <era>/<start-era>-<end-era> 13或9-12 查找给定时代范围内分配的所有闭包
成本中心ID 成本中心ID 107600 查找在此成本中心ID下分配的所有关闭(直接或间接)
封口尺寸 国际 1000 查找大于特定大小的所有闭包
闭合类型 闭包类型描述 箭头 查找所有ARR_WORDS闭包

所有这些查询都是保留查询,它们不仅会显示闭包有疑问,但也包括护圈堆栈,它解释了为什么要保留它们。

分析命令的改进

ghc-调试块早就提供了一个配置文件命令来执行堆遍历并提供类似于来自-小时轮廓。此查询的结果现在以交互方式显示在终端界面中。对于每个条目,标题中的左栏显示中的闭包类型问题,分配的此闭包类型的总数,此闭包占用堆上的字节数,每个的最大大小这些闭包以及每个已分配闭包的平均大小。右列显示了相同的统计信息,但接管了当前堆样本。

一个1级配置文件,显示在ghc-debug-brick中

每个条目都可以展开,每个频带中的五个采样点都会保存下来,这样您就可以检查一些影响带尺寸的封口。例如,这里我们扩展THUNK闭包,可以看到5个THUNK的样本,其中有21万个住在这堆地上的暴徒。

在1级配置文件中展开THUNK条目

TUI还增加了对2级闭合型剖面的支持。作为配置文件,2级配置文件比1级配置文件粒度更细键还包含闭包的指针参数,而不仅仅是闭包本身。钥匙:[(,), :]表示list-cons构造函数,其中head参数是一个2元组,尾部参数是另一个列表cons。

显示在ghc-debug-brick中的2级配置文件

例如,在2级配置文件中,不同类型的列表将显示为不同的带区。在上面的配置文件中,您可以看到4种不同类型的列表产生的4个不同的波段。Thunk通常也会单独出现,因为它们也根据他们的不同论点。示例功能也适用于2级配置文件所以很容易理解每个波段到底对应什么您的程序。

其他UI改进

除了上面讨论的新功能外,最近的一些其他增强功能包括:

  • 提高了显示大量数字时主视图的性能第行,共行。这显著减少了滚动时的输入延迟。
  • 搜索限制被硬编码为100个对象,这意味着只有搜索的前几个结果将在UI中可见。这个现在可以在UI中配置限制。
  • TUI中现在提供了其他分析,例如发现重复箭头闭包,这对于识别程序最终存储许多相同字节字符串的副本。

结论

我们希望ghc调试ghc-调试块将有助于任何希望对其堆进行详细检查的人的工作流Haskell过程。

这项工作是与水银Mercury长期致力于Haskell的可扩展性和健壮性生态系统,并支持开发内存评测工具帮助实现这些目标。

Well-Typed总是对项目感兴趣,并寻求资金来改进GHC和其他Haskell工具。请联系info@well-typed.com如果我们也许能和你一起工作!