如果一个程序运行并且出现“零除”的消息,那么识别代码中哪里出现这个错误的最好方法是什么?如何用ghc 7.10.3除零产生堆栈轨迹?
回答
GHC不支持堆栈跟踪,因为没有调用堆栈。您可以做的最好的方法是在基本模块GHC.Stack
中使用模拟堆栈跟踪机器。
与GHC 7.8开始,并且因此在7.10.3可用,GHC.Stack
暴露
errorWithStackTrace :: String -> a
作用就像error
上正常建立但使用SCC的注释(例如,从--fprof-auto
)来构造一个近似堆栈跟踪在异形构建。您将需要重新编译启用分析以支持此功能。如果您正在使用cabal,则可以运行
cabal configure --enable-library-profiling --enable-executable-profiling
并重建。
从GHC 8.0开始,errorWithStackTrace
已弃用,并且由HasCallStack
机器提供对呼叫站生成的支持。
从GHC.Stack
文档现在报价,
函数可以用
HasCallStack
约束要求其调用点。例如,我们可以定义errorWithCallStack :: HasCallStack => String -> a
为
error
变体,将得到其调用点。我们可以通过callStack
访问errorWithCallStack
内的调用栈。errorWithCallStack :: HasCallStack => String -> a errorWithCallStack msg = error (msg ++ "n" ++ prettyCallStack callStack)
因此,如果我们调用
errorWithCallStack
我们将得到一个格式化的调用堆栈与我们的错误消息。>>> errorWithCallStack "die" *** Exception: die CallStack (from HasCallStack): errorWithCallStack, called at <interactive>:2:1 in interactive:Ghci1
(我猜msg ++ "\n"
了意思,但"n"
是怎样写的。)
虽然你可以用GHC 7.8和获得一些非常有限的堆栈跟踪的支持,我会建议升级如果可能的话,以GHC 8为明显更好的支持。无论哪种方式,它不会是你从其他语言习惯的,但它总比没有好。
在最新的GHC版本中,'error' *是*'errorWithCallStack'。而且这些文档似乎表明你比使用'HasCallStack'获得更好的配置文件的堆栈跟踪。我还没有尝试过配置文件的方式。 – dfeuer
@dfeuer我是否正确理解GHC 8.2.1 w /'-prof'应该产生更好的调用栈?它似乎并不如此:https://gist.github。com/TomMD/7d1fb8dc762fc37bf80b7b7dd447e29a –
即使启用性能分析(通过'stack build --profile'),我只看到错误消息“除以零”,没有额外的上下文。假设有一个代码库,其中除法操作('/'或'\'div \'')出现在几十个呼叫站点。如果在运行时遇到错误消息“被零除”,并且任何这些调用站点似乎都可能成为错误源,那么如何调试呢?必须用一些带注释的版本来替换除法操作的每个实例(充其量,缩小二进制搜索中的违规呼叫站点)? – kostmo
- 1. 如何从`polyc`去堆栈轨迹?
- 2. 如何升级堆栈GHC
- 3. 在ClojureScript中获取堆栈轨迹
- 4. 何处将升降机env配置为隐藏堆栈轨迹的生产?
- 5. 堆栈轨迹skipps的一种方法?
- 6. 在Cursive REPL中查看堆栈轨迹
- 7. 难以理解堆栈轨迹
- 8. 如何在Zend框架中显示堆栈轨迹2
- 9. 如何展开XCode 4中的堆栈轨迹
- 10. 如何避免产生与堆栈中
- 11. 当-g应该用于在OCaml中打印堆栈轨迹?
- 12. 我的堆栈轨迹中的行号怎么会出错?
- 13. 粗体/颜色堆栈轨迹中的特定行
- 14. 在重新排列的错误中合并堆栈轨迹
- 15. 防止方法出现在堆栈轨迹中
- 16. 了解分段故障的堆栈轨迹
- 17. 可能在Screeps中获取行号或堆栈轨迹?
- 18. 使用堆栈ghc作为ghc的替换
- 19. CompletableFuture故意吹堆栈不会产生堆栈溢出?
- 20. 如何产生轨
- 21. 如何在“!htrace -diff”结果中获取堆栈轨迹的所有帧?
- 22. 在ASP.MVC中,如何在ViewData中放置JavaScript友好的异常堆栈轨迹?
- 23. 如何使用已安装的ghc与nix-shell中的堆栈?
- 24. 如何在堆栈中使用不同的ghc版本?
- 25. 如何禁用轨迹球?
- 26. 堆栈GHC错误“无效选项'--make`
- 27. 如何使用堆栈产生多列数据框?
- 28. Julia中较长的堆栈痕迹
- 29. 沉默黄瓜堆栈痕迹
- 30. 哈斯克尔:用快乐1.19.5与GHC问题7.10.3
你可以限定“最好”吗?一般来说,堆栈跟踪在懒惰的函数式语言中并没有你所期望的那么有意义,所以可能你最好的选择是启用分析。否则,请使用['CallStack'](https://hackage.haskell.org/package/base-4.10.0.0/docs/GHC-Stack.html)。 – user2407038
我想我会解决任何识别错误发生的源代码中的行的方法。当你说启用性能分析时,这是否意味着我可以使用一些额外的参数(哪些?)运行'stack build',然后当我执行程序时,它会伴随更多信息的错误? – kostmo