Debugging 通过cabal repl调试/进入包模块
因此,我有以下代码,我的目标是能够从Debugging 通过cabal repl调试/进入包模块,debugging,haskell,ghc,cabal,ghci,Debugging,Haskell,Ghc,Cabal,Ghci,因此,我有以下代码,我的目标是能够从main直接进入标准中的函数defaultMain。main: {-# 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]
main
直接进入标准中的函数defaultMain
。main
:
{-# 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"
此外,如果我尝试添加包,我会得到以下错误:
*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.
然后在执行阴谋集团构建时
我得到以下错误:
criterion/Criterion/IO.hs:23:0:
error: missing binary operator before token "("
#if MIN_VERSION_binary(0, 6, 3)
所以我怀疑我必须对标准阴谋集团进行全面的合并
上面是我的阴谋集团档案,感觉有点过分
有没有更简单的方法来设置断点
在Criteria中,这样我就可以(在cabal repl/ghci中调试时)直接从我的源代码单步执行到Criteria的源代码中?谢谢
p、 在美国,有一个相关的问题,但不幸的是,它没有帮助。这就是我如何设法实现期望的目标,能够(在
阴谋集团repl
内)从我的代码进入标准源:
mkdir /tmp/testCrit
cd /tmp/testCrit
criteria-1.1.0.0.tar.gz
/tmp/testCrit
,因此我们应该有/tmp/testCrit/criteria-1.1.0.0
。在这个目录中,我们有criteria.hs
等cd /tmp/testCrit/criterion-1.1.0.0
cabal sandbox init
cabal install -j
请注意,这将创建一个目录:/tmp/testCrit/criteria-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
,稍后将使用该目录/tmp/testCrit
中,创建一个Main.hs
文件,其中包含上面的基准代码和上面的cabal文件,但以以下方式将其与/tmp/testCrit/criteria-1.1.0.0
中包含的Criteria cabal文件合并。注:主要新增内容如下:
cc-options: -fPIC
hs-source-dirs:
./
./criterion-1.1.0.0
./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
它允许您在cabal repl
中运行它,并执行以下操作
线路:
hs-source-dirs:
./
./criterion-1.1.0.0
./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
完整的阴谋集团文件应该如下所示:
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
阴谋集团repl
,直接进入
标准来自我们的Main.hs
code:
*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 = _
我不知道
cabal
文件部分的答案,但据我所知,GHCi只能调试内部字节码格式的代码。特别是,您希望避免使用cabal build
进行本机编译,因为生成的.o
文件将默认使用,而不是字节码。@ØrjanJohansen谢谢,我以前曾通过“合并”cabal文件调试过cassava,这使我能够无缝地从应用程序进入cassava。但是,对Criteria进行相同的尝试会导致Criteria-1.1.0.0/cbits/time posix.o:在创建共享对象时,无法使用针对未定义符号时钟的重新定位R_X86_64_PC32@@GLIBC_2.2.5;用-fPIC重新编译,这正是我目前试图解决的问题@ØrjanJohansen:啊,似乎解决上述注释中的时间posix.o
错误的方法是添加选项cc options:-fPIC
。因此,目前我可以通过合并阴谋集团文件并将cc选项:-fPIC
添加到生成的阴谋集团文件中来实现所需的行为。太棒了!这听起来确实是一个非常有用的提示。如果你愿意,你可以发布你自己问题的答案,描述你是如何解决的。@rjanJohansen:我在下面发布了这个方法。谢谢
*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 = _