- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有来自 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
内)进入标准源的预期目标:
首先要做的事情:
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 文件,但将其与标准合并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
然后在主目录中执行:
cd /tmp/testCrit/
cabal sandbox init
cabal install -j
然后我们可以启动一个 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/
我是haskell和cabal的新手,所以我可能缺少一些简单的东西。 我更新了 cabal 安装: sudo cabal install cabal-install Password: Resolvi
这个问题只有yak-shaving尝试排除故障 another problem . 因此,为了诊断我的另一个问题,建议我尝试: cabal unpack base cd base-4.3.1.0 ca
当我安装 vector和: cabal install vector 我收到很多 SpecConstr如果我可以指定 -fspec-constr-count=SOMETHING-HIGHER,限制将消
当我尝试安装目录包时出现以下错误: $ cabal install directory Resolving dependencies... Failed to install directory-1.
我刚刚在运行 Mavericks 10.9 的 Mac 上安装了 Haskell 平台。包含的 cabal 版本 (1.16) 已过时,并提示我运行“cabal update”,然后运行“cabal
我已经在 I:\cabal 和 ghc 文件夹中分别安装了 cabal 和 I:\ghc 文件夹。我之前安装了 Haskell-Platform,但是没有用,我不得不卸载它。但是有一个名为 C:\Us
我已经制作了一个 Cabal 沙箱,并为它安装了一个软件包,但 runhaskell Setup configure提示我刚刚安装的软件包依赖项丢失了。 我验证了包名和版本,没问题。 运行 cabal
我是否需要手动编辑 *.cabal 文件的 build-depends部分添加包作为项目依赖? 或者也许有一种更方便的方法,它不像手动修改构建文件那样容易出错。 考虑我使用的几乎所有包管理器都具有的功
当我做 cabal --version我懂了: cabal-install version 0.14.0 using version 1.14.0 of the Cabal library 那么有什么
我刚刚做了brew install haskell-platform它安装了 Glorious Glasgow Haskell 编译系统,版本 7.6.3 。 $ cabal --version ca
我需要通过 Cabal 安装 Yesod 和依赖项,不幸的是我无法更新 cabal。外壳输出: ...$ sudo cabal install cabal-install Resolving depe
我似乎在 cabal 中的依赖关系图损坏方面遇到了很多问题,我最终尝试遵循 SO 建议转向 cabal-dev,但由于类似的原因,它无法安装。 跳过原始安装尝试的许多页面,以下是当前状态: C:\Us
每次我安装库时,cabal 都会告诉我安装新版本的 cabal-install。尽管我运行了(明显成功)下面列出的过程,但 cabal-install 的版本保持不变。我哪里错了? (我的操作系统是W
当我通过 sudo apt-get 安装 Haskell/GHC+cabal 时我安装了 Cabal 1.16 版。这显然不是最新的版本。我将如何升级到至少 1.18 版?我试着做 sudo apt-
我制作了自己的 cabal 包(我们称之为 package-1),其中包含两个目标,一个库和一个可执行文件。库部分有一个构建依赖列表,而可执行文件有另一个更大的构建依赖列表。 现在我创建了 packa
当我在 vim 中构建一个 cabal 项目时,使用 :set makeprg=cabal\ build :make haskellmode-vim似乎没有找到类型信息。当光标位于 foo 上时执行
我刚刚通过 apt-get 在 Linux Mint 12 上进行了全新的 haskell 平台安装。每次我尝试使用 cabal-install 安装一些 hackage 包时,我都会得到: coul
当我在 vim 中构建一个 cabal 项目时,使用 :set makeprg=cabal\ build :make haskellmode-vim似乎没有找到类型信息。当光标位于 foo 上时执行
我有两个正在开发的软件包,A和 B .包B取决于 A . A是在它自己的沙盒中开发的,B 也有类似的情况。 : A> cabal sandbox init A> cabal install --ena
看来我错过了什么。据我了解cabal sandbox init表示从当前文件夹和所有子文件夹全部 cabal install命令的范围为沙箱。因此,此文件夹之外的所有内容都不在沙箱中。 那么 caba
我是一名优秀的程序员,十分优秀!