Debugging/Stepping 通过 cabal repl 进入包模块
Debugging/Stepping into a package module via cabal repl
所以我有来自 的以下代码,我的目标是能够从 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) ()]
]
阴谋集团文件是:
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
此外,如果我尝试 add
包,我会收到以下错误:
*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 进行完整的合并
上面加上我的cabal文件,感觉有点过分。
有没有更简单的方法来设置断点
在标准中,以便我可以(在 cabal repl/ghci 中调试时)直接从我的源代码进入标准的源代码?谢谢
p.s。 Debugging IO in a package module inside GHCi 上有一个相关问题,但不幸的是它没有帮助。
这就是我如何设法实现能够(在 cabal repl
内)从我的代码进入标准源的预期目标:
首先做:
mkdir /tmp/testCrit
cd /tmp/testCrit
下载criterion-1.1.0.0.tar.gz
解压到/tmp/testCrit
,所以我们应该有/tmp/testCrit/criterion-1.1.0.0
。在这个目录中我们有Criterion.hs
等
然后跳转到包含标准源的文件夹并执行:
cd /tmp/testCrit/criterion-1.1.0.0
cabal sandbox init
cabal install -j
请注意,这会创建一个目录:/tmp/testCrit/criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
,我们稍后会用到它
返回 /tmp/testCrit
创建一个 Main.hs
文件,其中包含上面的基准代码和上面的 cabal 文件,但将其与 [=20 中包含的标准 cabal 文件合并=] 通过以下方式。请注意,新增的主要内容是以下几行:
cc-options: -fPIC
允许 运行 它在 cabal repl
中,以及以下
行:
hs-source-dirs:
./
./criterion-1.1.0.0
./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
完整的 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,
aeson >= 0.8,
ansi-wl-pprint >= 0.6.7.2,
base >= 4.5 && < 5,
binary >= 0.5.1.0,
bytestring >= 0.9 && < 1.0,
cassava >= 0.3.0.0,
containers,
deepseq >= 1.1.0.0,
directory,
filepath,
Glob >= 0.7.2,
hastache >= 0.6.0,
mtl >= 2,
mwc-random >= 0.8.0.3,
optparse-applicative >= 0.11,
parsec >= 3.1.0,
statistics >= 0.13.2.1,
text >= 0.11,
time,
transformers,
transformers-compat >= 0.4,
vector >= 0.7.1,
vector-algorithms >= 0.4
default-language: Haskell2010
ghc-options: "-O3"
c-sources:
./criterion-1.1.0.0/cbits/cycles.c
./criterion-1.1.0.0/cbits/time-posix.c
hs-source-dirs:
./
./criterion-1.1.0.0
./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
cc-options: -fPIC
然后在主目录中执行:
cd /tmp/testCrit/
cabal sandbox init
cabal install -j
然后我们可以旋转一个cabal repl
直接进入
标准 来自我们的 Main.hs
代码 :
*Main> :break Criterion.Main.defaultMain
Breakpoint 0 activated at criterion-1.1.0.0/Criterion/Main.hs:79:15-43
*Main> main
Stopped at criterion-1.1.0.0/Criterion/Main.hs:79:15-43
_result :: [Benchmark] -> IO () = _
[criterion-1.1.0.0/Criterion/Main.hs:79:15-43] *Main> :step
Stopped at criterion-1.1.0.0/Criterion/Main.hs:(131,1)-(147,39)
_result :: IO () = _
[criterion-1.1.0.0/Criterion/Main.hs:(131,1)-(147,39)] *Main> :step
Stopped at criterion-1.1.0.0/Criterion/Main.hs:(131,29)-(147,39)
_result :: IO () = _
bs :: [Benchmark] = [_]
defCfg :: Criterion.Types.Config = _
[criterion-1.1.0.0/Criterion/Main.hs:(131,29)-(147,39)] *Main> :step
Stopped at criterion-1.1.0.0/Criterion/Main.hs:132:10-37
_result :: IO Criterion.Main.Options.Mode = _
defCfg :: Criterion.Types.Config = _
所以我有来自 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) ()]
]
阴谋集团文件是:
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
此外,如果我尝试 add
包,我会收到以下错误:
*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 进行完整的合并 上面加上我的cabal文件,感觉有点过分。
有没有更简单的方法来设置断点 在标准中,以便我可以(在 cabal repl/ghci 中调试时)直接从我的源代码进入标准的源代码?谢谢
p.s。 Debugging IO in a package module inside GHCi 上有一个相关问题,但不幸的是它没有帮助。
这就是我如何设法实现能够(在 cabal repl
内)从我的代码进入标准源的预期目标:
首先做:
mkdir /tmp/testCrit cd /tmp/testCrit
下载
criterion-1.1.0.0.tar.gz
解压到
/tmp/testCrit
,所以我们应该有/tmp/testCrit/criterion-1.1.0.0
。在这个目录中我们有Criterion.hs
等然后跳转到包含标准源的文件夹并执行:
cd /tmp/testCrit/criterion-1.1.0.0 cabal sandbox init cabal install -j
请注意,这会创建一个目录:
/tmp/testCrit/criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
,我们稍后会用到它返回
/tmp/testCrit
创建一个Main.hs
文件,其中包含上面的基准代码和上面的 cabal 文件,但将其与 [=20 中包含的标准 cabal 文件合并=] 通过以下方式。请注意,新增的主要内容是以下几行:cc-options: -fPIC
允许 运行 它在
cabal repl
中,以及以下 行:hs-source-dirs: ./ ./criterion-1.1.0.0 ./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
完整的 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, aeson >= 0.8, ansi-wl-pprint >= 0.6.7.2, base >= 4.5 && < 5, binary >= 0.5.1.0, bytestring >= 0.9 && < 1.0, cassava >= 0.3.0.0, containers, deepseq >= 1.1.0.0, directory, filepath, Glob >= 0.7.2, hastache >= 0.6.0, mtl >= 2, mwc-random >= 0.8.0.3, optparse-applicative >= 0.11, parsec >= 3.1.0, statistics >= 0.13.2.1, text >= 0.11, time, transformers, transformers-compat >= 0.4, vector >= 0.7.1, vector-algorithms >= 0.4 default-language: Haskell2010 ghc-options: "-O3" c-sources: ./criterion-1.1.0.0/cbits/cycles.c ./criterion-1.1.0.0/cbits/time-posix.c hs-source-dirs: ./ ./criterion-1.1.0.0 ./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen cc-options: -fPIC
然后在主目录中执行:
cd /tmp/testCrit/ cabal sandbox init cabal install -j
然后我们可以旋转一个
cabal repl
直接进入 标准 来自我们的Main.hs
代码 :*Main> :break Criterion.Main.defaultMain Breakpoint 0 activated at criterion-1.1.0.0/Criterion/Main.hs:79:15-43 *Main> main Stopped at criterion-1.1.0.0/Criterion/Main.hs:79:15-43 _result :: [Benchmark] -> IO () = _ [criterion-1.1.0.0/Criterion/Main.hs:79:15-43] *Main> :step Stopped at criterion-1.1.0.0/Criterion/Main.hs:(131,1)-(147,39) _result :: IO () = _ [criterion-1.1.0.0/Criterion/Main.hs:(131,1)-(147,39)] *Main> :step Stopped at criterion-1.1.0.0/Criterion/Main.hs:(131,29)-(147,39) _result :: IO () = _ bs :: [Benchmark] = [_] defCfg :: Criterion.Types.Config = _ [criterion-1.1.0.0/Criterion/Main.hs:(131,29)-(147,39)] *Main> :step Stopped at criterion-1.1.0.0/Criterion/Main.hs:132:10-37 _result :: IO Criterion.Main.Options.Mode = _ defCfg :: Criterion.Types.Config = _