调试haskell:在每次调用时显示函数的名称

66bbxpm5  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(145)

有没有一个工具可以自动“标记”一些函数,这样我就可以得到一个近似的“调用堆栈”。
实际上,我希望有一个类似于您通过编写fct = Debug.trace "fct" $ ...而不必在每个函数之前添加它的行为。
我知道profiling与-fprof-auto的作用类似,但我需要在应用程序运行时显示它。
有些时候,我有无限循环,有这个显示器可以立即告诉我哪个函数(s)有故障。使用hlist和断点并没有多大帮助,因为你已经知道了循环中某个函数的名字。

nbysray5

nbysray51#

这是一件令人难以置信的丑陋的事;- ),它只给你行号而不是函数名,但我惊讶地发现它工作,所以我想我应该分享它。总比什么都没有好。你可以使用C预处理器,就像在过去的C时代一样:

{-# LANGUAGE CPP #-}

#define traceLoc trace (__FILE__ ++":"++ show __LINE__)

import Debug.Trace

f 0 = traceLoc $ 1
f n = traceLoc $ g (n-1)
g 0 = traceLoc $ 2
g n = traceLoc $ 2 * f (n-1)

现在

*Main> f 3
Test.hs:16
Test.hs:18
Test.hs:16
Test.hs:17
4
rdrgkggo

rdrgkggo2#

我已经为GHC 9+开发了一个插件,它可以做这件事,但不是对每个函数调用,而是将类似CFG的东西打印到名为run.out的文件中
下面是链接:
https://github.com/moxeed/bug-riper/blob/master/plugin/Instrumentation.hs
不幸的是,它不是一个包,你必须通过GHC中的fplugin标志手动将其添加到代码中:

common instrumentation
    ghc-options: -fwrite-ide-info
                 -hiedir=.hie
                 -Wall 
                 --fhpc
                 -fplugin=Instrumentation
    build-depends: plugin-lib

通过在构建代码时添加-O 0标志,它实际上会为每个调用打印。只要记住在调试完成后删除它。

相关问题