如果一個程序運行並且出現「零除」的消息,那麼識別代碼中哪裏出現這個錯誤的最好方法是什麼?如何用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