这是一个简单的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
?
我尝试使用:print
和ghci
只是抱怨"不在范围"。
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>
答案 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
出现。