gpt4 book ai didi

通过 cabal repl 调试/单步进入包模块

转载 作者:行者123 更新时间:2023-12-02 22:35:59 24 4
gpt4 key购买 nike

所以我有来自 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 进行全面合并与我上面的 cabal 文件一起使用,感觉有点过分了。

有没有更简单的方法来设置断点在 Criterion 中,以便我可以(在 cabal repl/ghci 中调试时)直接从我的源代码进入标准的源代码?谢谢

附:有一个相关问题Debugging IO in a package module inside GHCi但不幸的是它没有帮助。

最佳答案

这就是我如何设法实现能够从我的代码单步(在 cabal repl 内)进入标准源的预期目标:

  1. 首先要做的事情:

    mkdir /tmp/testCrit
    cd /tmp/testCrit
  2. 下载criterion-1.1.0.0.tar.gz

  3. 解压到/tmp/testCrit,所以我们应该有/tmp/testCrit/criterion-1.1.0.0。在这个目录中,我们有 Criterion.hs 等。

  4. 然后跳转到包含标准源的文件夹并执行以下操作:

    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,我们稍后将使用它

    <
  5. 返回 /tmp/testCrit 创建一个 Main.hs 文件,其中包含上面的基准代码以及上面的 cabal 文件,但将其与标准合并cabal 文件包含在 /tmp/testCrit/criterion-1.1.0.0 中,方式如下。请注意,主要新增内容是以下几行:

    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
  6. 然后在主目录中执行:

    cd /tmp/testCrit/
    cabal sandbox init
    cabal install -j
  7. 然后我们可以启动一个 cabal repl 并直接进入标准来 self 们的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 = _

关于通过 cabal repl 调试/单步进入包模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29477748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com