带有崩溃的Haskell程序的空.prof文件(在Windows上)

时间:2014-08-09 00:49:32

标签: haskell profiling ghc

我试图通过使用分析来诊断程序中的无限循环。因为我必须使用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文件。

其他详情

  • Cabal:using version 1.16.0 of the Cabal library
  • GHC:Glasgow Haskell Compiler, Version 7.6.3, stage 2 booted by GHC version 7.4.1

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文件。