我有以下来自Preventing caching of computation in Criterion benchmark的代码,我的目标是能够直接从main
步进到Criterion.Main
中的defaultMain
函数:
{-# OPTIONS -fno-full-laziness #-}
{-# OPTIONS_GHC -fno-cse #-}
{-# LANGUAGE BangPatterns #-}
module Main where
import Criterion.Main
import Data.List
num :: Int
num = 100000000
lst :: a -> [Int]
lst _ = [1,2..num]
myadd :: Int -> Int -> Int
myadd !x !y = let !result = x + y in
result
mysum = foldl' myadd 0
main :: IO ()
main = defaultMain [
bgroup "summation"
[bench "mysum" $ whnf (mysum . lst) ()]
]
而 cabal 文件是:
name: test
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable test
main-is: Main.hs
build-depends: base >=4.8 && <4.9,
criterion==1.1.0.0
default-language: Haskell2010
ghc-options: "-O3"
(使用ghc 7.10.1和cabal 1.22.0.0)。
如果我在
cabal repl
中尝试在标准中设置断点,则会出现以下错误:*Main> :break Criterion.Main.defaultMain
cannot set breakpoint on defaultMain: module Criterion.Main is not interpreted
此外,如果我尝试
添加
此软件包,则会出现以下错误:*Main> :add *Criterion
<no location info>: module ‘Criterion’ is a package module
Failed, modules loaded: Main.
如果我在目录中执行
git clone https://github.com/bos/criterion
命令,然后在 cabal 文件中添加以下两行:other-modules: Criterion
hs-source-dirs: .
./criterion
然后我执行cabal build
时,出现以下错误:
criterion/Criterion/IO.hs:23:0:
error: missing binary operator before token "("
#if MIN_VERSION_binary(0, 6, 3)
我怀疑我必须对准则小组的cabal文件进行全面合并,这感觉有些过度。是否有更简单的方法让我在Criterion中设置断点,以便我可以直接从我的源代码步进(在cabal repl / ghci中进行调试)到Criterion的源代码?谢谢。 附:有一个相关问题: Debugging IO in a package module inside GHCi ,但不幸的是它没有帮助。
cabal
文件部分的答案,但据我所知,GHCi只能调试其内部字节码格式的代码。特别是,您要避免使用cabal build
进行本地编译,因为生成的.o
文件将默认用于字节码。 - Ørjan Johansencriterion-1.1.0.0/cbits/time-posix.o: relocation R_X86_64_PC32 against undefined symbol clock_gettime@@GLIBC_2.2.5 can not be used when making a shared object; recompile with -fPIC
的错误,这是我目前正在尝试解决的问题! - artellatime-posix.o
错误的方法似乎是添加选项cc-options: -fPIC
。因此,我可以通过合并cabal文件并将cc-options: -fPIC
添加到生成的cabal文件中来实现所需的行为。 - artella