有没有一个工具可以自动“标记”一些函数,这样我就可以得到一个近似的“调用堆栈”。实际上,我希望有一个类似于您通过编写fct = Debug.trace "fct" $ ...而不必在每个函数之前添加它的行为。我知道profiling与-fprof-auto的作用类似,但我需要在应用程序运行时显示它。有些时候,我有无限循环,有这个显示器可以立即告诉我哪个函数(s)有故障。使用hlist和断点并没有多大帮助,因为你已经知道了循环中某个函数的名字。
fct = Debug.trace "fct" $ ...
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
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标志,它实际上会为每个调用打印。只要记住在调试完成后删除它。
2条答案
按热度按时间nbysray51#
这是一件令人难以置信的丑陋的事;- ),它只给你行号而不是函数名,但我惊讶地发现它工作,所以我想我应该分享它。总比什么都没有好。你可以使用C预处理器,就像在过去的C时代一样:
现在
rdrgkggo2#
我已经为GHC 9+开发了一个插件,它可以做这件事,但不是对每个函数调用,而是将类似CFG的东西打印到名为run.out的文件中
下面是链接:
https://github.com/moxeed/bug-riper/blob/master/plugin/Instrumentation.hs
不幸的是,它不是一个包,你必须通过GHC中的fplugin标志手动将其添加到代码中:
通过在构建代码时添加-O 0标志,它实际上会为每个调用打印。只要记住在调试完成后删除它。