如何检查haskell字节码

时间:2013-12-06 16:47:46

标签: haskell ghc

我试图找出一个错误(严重的性能降级)。不幸的是,我无法通过回溯我的代码的许多不同版本来弄清楚为什么。我怀疑它可能是我已更新的库的一些修改,更不用说同时我已经从7.4更新到ghc 7.6(如果有人知道某些懒惰行为是否已经改变,我会非常感激它!)。我有一个较旧的此代码可执行文件,没有这个错误,因此我想知道是否有任何工具告诉我之前链接到的库版本?就好像它可以找出符号等等。谢谢!

1 个答案:

答案 0 :(得分:3)

我怀疑你是否愿意这样做,但无论如何我都会尝试回答这个问题。

GHC创建可执行文件,这是众所周知的难以理解....在我的linux框中,我可以通过输入

来查看汇编代码
objdump -d <executable filename>

但是我从一个用Haskell编写的简单“hello world”程序中获得了超过100K行代码。

如果您碰巧拥有ghc .hi文件,可以通过输入

获取有关可执行文件的一些信息
ghc --show-iface <hi filename>

这不会给你汇编代码,但你可以获得一些可能有用的额外信息。

正如我在上面的评论中所提到的,在Linux上你可以使用“ldd”来查看你在编译中使用的c系统库,但这也可能不太有用。

你可以尝试使用反汇编程序,但是那些通常被编写为反汇编到c,而不是更高级别,当然也不是Haskell。话虽这么说,GHC编译为c作为中介(至少它已经改变了?),所以你可能能够学到一些东西。

我个人经常发现视图系统调用比查看纯组件更有趣。在我的Linux机器上,我可以通过使用strace运行来查看所有系统调用(使用wireshark作为等效的网络流量):

strace <program executable>

这也会生成大量数据,所以如果您知道直接真实世界通信(即更改硬盘上的文件)出错的某个特定位置,它可能才有用。

老实说,你可能最好只是从源代码调试问题,虽然根据实际问题,这些技术中的一些可能会帮助你找到一些东西。

其中大多数工具都有Mac和Windows等效工具。