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调试
哈斯克尔API或修改ghc-调试块
代码本身支持您的自定义查询。
过滤器提供了一个可组合的工作流,以便执行更高级的查询。您可以从可能的筛选器列表中选择要应用的筛选器,如构造函数名称、闭包大小、纪元等,并将其添加到当前过滤器堆栈进行自定义搜索查询。每个过滤器也可以反转。
在实现了对eras评测的支持后,我们有动力添加此功能因为将现有查询与按时代筛选相结合通常很有用。使用这些过滤器,可以轻松表达您自己的特定于域的查询,例如:
- 查找
富
在特定时代分配的施工人员。
- 查找全部
箭头
大于1000字节的闭包。
- 让我看看这个时代留下的一切,除了
箭头
和格雷
建造师。
以下是当前可用过滤器的完整列表:
地址 |
结束地址 |
0x421c3d93c0 |
找到带有特定地址的闭包 |
信息表 |
信息表地址 |
0x1664ad70 |
查找具有特定信息表的所有闭包 |
施工单位名称 |
施工单位名称 |
箱子 |
查找具有给定构造函数名称的所有闭包 |
闭包名称 |
闭包名称 |
状态_存储J_信息 |
查找具有特定闭包名称的所有闭包 |
时代 |
<era>/<start-era>-<end-era> |
13或9-12 |
查找给定时代范围内分配的所有闭包 |
成本中心ID |
成本中心ID |
107600 |
查找在此成本中心ID下分配的所有关闭(直接或间接) |
封口尺寸 |
国际 |
1000 |
查找大于特定大小的所有闭包 |
闭合类型 |
闭包类型描述 |
箭头 |
查找所有ARR_WORDS闭包 |
所有这些查询都是保留查询,它们不仅会显示闭包有疑问,但也包括护圈堆栈,它解释了为什么要保留它们。
分析命令的改进
ghc-调试块
早就提供了一个配置文件命令来执行堆遍历并提供类似于来自-小时
轮廓。此查询的结果现在以交互方式显示在终端界面中。对于每个条目,标题中的左栏显示中的闭包类型问题,分配的此闭包类型的总数,此闭包占用堆上的字节数,每个的最大大小这些闭包以及每个已分配闭包的平均大小。右列显示了相同的统计信息,但接管了当前堆样本。
每个条目都可以展开,每个频带中的五个采样点都会保存下来,这样您就可以检查一些影响带尺寸的封口。例如,这里我们扩展THUNK闭包,可以看到5个THUNK的样本,其中有21万个住在这堆地上的暴徒。
TUI还增加了对2级闭合型剖面的支持。作为配置文件,2级配置文件比1级配置文件粒度更细键还包含闭包的指针参数,而不仅仅是闭包本身。钥匙:[(,), :]
表示list-cons构造函数,其中head参数是一个2元组,尾部参数是另一个列表cons。
例如,在2级配置文件中,不同类型的列表将显示为不同的带区。在上面的配置文件中,您可以看到4种不同类型的列表产生的4个不同的波段。Thunk通常也会单独出现,因为它们也根据他们的不同论点。示例功能也适用于2级配置文件所以很容易理解每个波段到底对应什么您的程序。
其他UI改进
除了上面讨论的新功能外,最近的一些其他增强功能包括:
- 提高了显示大量数字时主视图的性能第行,共行。这显著减少了滚动时的输入延迟。
- 搜索限制被硬编码为100个对象,这意味着只有搜索的前几个结果将在UI中可见。这个现在可以在UI中配置限制。
- TUI中现在提供了其他分析,例如发现重复
箭头
闭包,这对于识别程序最终存储许多相同字节字符串的副本。
结论
我们希望ghc调试
和ghc-调试块
将有助于任何希望对其堆进行详细检查的人的工作流Haskell过程。
这项工作是与水银。Mercury长期致力于Haskell的可扩展性和健壮性生态系统,并支持开发内存评测工具帮助实现这些目标。
Well-Typed总是对项目感兴趣,并寻求资金来改进GHC和其他Haskell工具。请联系info@well-typed.com如果我们也许能和你一起工作!