2015-04-06 20 views
3

所以不得不從Preventing caching of computation in Criterion benchmark下面的代碼和我的目標是能夠從main直接步入函數defaultMainCriterion.Main調試/踏入經由小集團REPL一封裝模塊

{-# 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) 

,所以我懷疑是我必須做一個完整的標準小集團 文件上面我的陰謀文件,這感覺有點過分的合併。

是否有更簡單的方法讓我去設置Criterion中的斷點 ,以便我可以直接從我的源代碼步驟(在調試cabal repl/ghci時)進入條件源代碼?謝謝

p.s.在Debugging IO in a package module inside GHCi有一個相關的問題,但不幸的是它沒有幫助。

+1

我不知道答案了'cabal'文件的一部分,但據我所知,GHCi只能*調試其內部字節碼格式的代碼。特別是,您希望避免使用'cabal build'進行本地編譯,因爲默認情況下將使用生成的'.o'文件而不是字節碼。 –

+0

@ØrjanJohansen謝謝,我已經設法通過「合併」cabal文件來調試木薯,這使我能夠無縫地從我的應用程序進入木薯。然而,在製作共享對象時,無法使用具有標準的條件導致「criterion-1.1.0.0/cbits/time-posix.o:relocation R_X86_64_PC32對未定義符號clock_gettime @@ GLIBC_2.2.5」;使用-fPIC'重新編譯,這正是我目前試圖解決的問題! – artella

+0

@ØrjanJohansen:上面評論中解決'time-posix.o'錯誤的方法似乎是添加選項'cc-options:-fPIC'。因此,目前我可以通過合併cabal文件並在結果cabal文件中添加cc-options:-fPIC來實現所需的行爲。 – artella

回答

1

這是我如何成功地實現了能夠從我的代碼步(內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文件,但以下面的方式將其與/tmp/testCrit/criterion-1.1.0.0中包含的標準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 
    

    完整的陰謀文件應該再像:

    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. 然後,我們可以從我們的Main.hs代碼旋轉起來cabal repl並直接步入 標準

    *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 = _ 
    
+0

我認爲步驟2-3可以用'cabal get'完成。 –