1

这是一个简单的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>
4

1 回答 1

2

使用 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出现。

于 2015-01-05T10:44:06.487 回答