我试图通过使用分析来诊断程序中的无限循环。因为我必须使用Ctrl-C中断程序,所以.prof文件仍为空。根据我的阅读,如果程序崩溃,.prof文件仍然可以正常工作。
为了测试它是否是我特定程序的配置,我写了这个:
module Main (
main
) where
testInf = map (+1) [1..]
main = do
print (show testInf)
我使用Leksah,配置会生成以下.cabal文件:
name: tests
version: 0.0.1
cabal-version: >=1.2
build-type: Simple
license: AllRightsReserved
license-file: ""
description:
data-dir: ""
executable tests
build-depends: base -any
main-is: Main.hs
buildable: True
hs-source-dirs: src
ghc-options: -prof -auto-all
然后我通过运行tests +RTS -p
来执行程序。当我用Crl-C终止程序时,.prof文件是0kb。如果我更改程序使它无法无限运行,它会在完成后生成一个完整的.prof文件。
其他详情
using version 1.16.0 of the Cabal library
Glasgow Haskell Compiler, Version 7.6.3, stage 2 booted by GHC version 7.4.1
答案 0 :(得分:0)
通过systemctl
运行程序时,我遇到了同样的问题。
我发送了SIGTERM
信号,并返回了一个空的*.prof
文件。
无论如何,发送SIGINT
信号都会给我我的.prof
文件。
在GHC的信号处理方面做一些挖掘: https://gitlab.haskell.org/ghc/ghc/blob/master/rts/posix/Signals.c#L510-528
这告诉我们如何处理SIGINT
:
* SIGINT handler.
*
* We like to shutdown nicely after receiving a SIGINT, write out the
* stats, write profiling info, close open files and flush buffers etc.
还有:
So the first ^C tries to exit the program
// cleanly, and the second one just kills it.
因此,如果您按一次^C (SIGINT)
,而程序尚未退出,则它可能仍会写入您的*.prof
文件,并进行其他清理。第二个^C (SIGINT)
会终止,并为您提供一个空的*.prof
文件。