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 = _