GHC恐慌:加载临时共享对象失败

时间:2015-08-11 08:53:13

标签: haskell ghc cabal

我们正在研究Parsec的分支(具有完整的QuickCheck测试套件,更好的错误消息和其他改进),并且已经取得了一些进展。大多数时候我使用Emacs的REPL,指定构建目标tests(显然是测试套件的名称)。这一直很好。

现在我们的东西通过了测试,一切似乎都没问题,但如果我用库目标启动REPL(或省略它,即cabal replcabal repl lib:megaparsec)并做一些事情,我会让GHC恐慌:

λ> parseTest (string "rere" <* eof) "reri"
ghc: panic! (the 'impossible' happened)
  (GHC version 7.10.1 for x86_64-unknown-linux):
    Loading temp shared object failed: /tmp/ghc9380_0/libghc9380_93.so: undefined symbol: _hpc_tickboxes_megapzuEw3SHAmfXgNLpm5a31oXO6_TextziMegaparsecziError_hpc

Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug

由于代码通过cabal repl tests编译并正常工作,我得出结论,这无论如何都不是我的编程错误,但可能是错误。

我找到了这张票:https://ghc.haskell.org/trac/ghc/ticket/10761,但我们的图书馆并没有使用模板Haskell。

实际问题是:我该怎么做以及如何解决这个问题?我甚至无法判断它是Cabal还是GHC,我不知道如何构建可以重现问题的最小例子。

我已经报道了:

https://ghc.haskell.org/trac/ghc/ticket/10765#ticket

1 个答案:

答案 0 :(得分:7)

如果您仔细阅读错误,您会注意到缺少的功能与hpc有关:

undefined symbol: _hpc_tickboxes_megapzuEw3SHAmfXgNLpm5a31oXO6_TextziMegaparsecziError_hpc

我的猜测是,HPC(haskell程序覆盖)所做的工具与GHCi所做的haskell代码的交互式加载不兼容。禁用HPC(class Boolean extends AbstractFilter { const TYPE_BOOLEAN = 1; const TYPE_INTEGER = 2; const TYPE_FLOAT = 4; const TYPE_STRING = 8; const TYPE_ZERO_STRING = 16; const TYPE_EMPTY_ARRAY = 32; const TYPE_NULL = 64; const TYPE_PHP = 127; const TYPE_FALSE_STRING = 128; const TYPE_LOCALIZED = 256; const TYPE_ALL = 511; 后跟cabal clean,确保在配置时禁用覆盖率)应该可以解决问题。

我建议报告GHC错误跟踪器上的一个错误(虽然这也可能是一个错误,不知道谁在这里有错)。