在wai / warp应用程序中使用ghci调试器

时间:2015-01-05 10:41:38

标签: haskell ghci haskell-warp

这是一个简单的wai / warp程序,因此我可以了解ghci调试器的实际工作原理: -

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types (status200)
import Network.Wai.Handler.Warp (run)
import Debug.Trace (trace)

myApp req respond = do 
    let x = 1 {- line 8 -}
    putStrLn "processing request" {- line 9 -}
    putStrLn "Hoooray!" {- line 10 -}
    respond $ responseLBS status200 [("Content-Type", "text/plain")] "Hello World" 

main = run 3000 myApp 

ghci中,我首先加载此程序(例如使用:load hellowai.hs)。

然后,我用

在第9行和第10行设置断点
:break 9
:break 10

然后,在ghci中,我执行main

然后我在我的浏览器上运行localhost:3000或使用curl(当然没关系),我的程序按预期在第9行中断。

如何打印(内省)x以及如何内省req

我尝试使用:printghci只是抱怨"不在范围"。

Stopped at hellowai.hs:9:5-33
_result :: IO () = _
[hellowai.hs:9:5-33] *Main> :print x

Top level: Not in scope: ‘x’
[hellowai.hs:9:5-33] *Main> :print req

Top level:
    Not in scope: ‘req’
    Perhaps you meant one of these:
      ‘rem’ (imported from Prelude), ‘seq’ (imported from Prelude)
[hellowai.hs:9:5-33] *Main>

1 个答案:

答案 0 :(得分:1)

使用GHCi命令:print ...(或:sprint ...),您可以打印范围内的变量。然而,这将仅打印评估值(回想Haskell是懒惰的)。

要评估和打印,只需直接使用变量名称即可。您可以使用:show bindings命令获取范围内的变量列表。

如果您没有在范围内看到变量,那么它们可能已被编译器优化掉了。在您的代码中,您不使用x,因此在编译期间可能会删除它。此外,代码如

foo = do
  let x = 3
  print "aa"
  print "bb"
  print x

可能被处理为(行号除外)

foo = do
  print "aa"
  print "bb"
  let x = 3
  print x

因此,在最后一行之前,您不会在范围内看到x。在这种情况下,请使用:step提前执行,直到您看到x出现。