如何指定GHC性能分析输出文件的存储目录(Stack+Windows/Linux)
解决方法:指定性能分析文件的输出目录
这个问题我之前也碰到过,默认输出到当前工作目录确实很容易踩权限坑,还好GHC的RTS选项支持直接指定这些性能分析文件的输出路径,有几种实用的解决方式:
1. 修改.cabal中的RTS选项(硬编码固定路径)
你可以直接在-with-rtsopts参数里,给每个输出文件指定完整的目标路径。GHC的RTS选项对不同类型的分析文件有不同的路径设置方式:
- 对于
.prof文件(由-p参数生成):把-p改成-p/your/target/dir/MyApplication,GHC会自动在路径后追加.prof后缀,最终生成/your/target/dir/MyApplication.prof - 对于
.hp文件(由-h参数生成):把-h改成-h/your/target/dir/MyApplication,直接生成/your/target/dir/MyApplication.hp - 对于日志文件(由
-s和-S参数生成):直接把文件名替换成带路径的完整名称,比如-s/your/target/dir/MyApplication-s.log和-S/your/target/dir/MyApplication-S.log
修改后的ghc-options示例:
ghc-options: -Wall -O2 -threaded -prof -fprof-auto -rtsopts -fprof-cafs "-with-rtsopts=-N -s/tmp/MyApplication-s.log -h/tmp/MyApplication.hp -i0.1 -p/tmp/MyApplication -M1G -S/tmp/MyApplication-S.log"
注意:请把
/tmp/替换成你实际有权限写入的目录(比如用户主目录下的~/profiles/),并且要确保这个目录已经存在,否则GHC会报错无法创建文件。
2. 运行时动态指定RTS选项(更灵活适配多环境)
如果不想在.cabal里硬编码路径,你可以在运行程序时手动传递RTS选项,覆盖cabal中的默认配置。这种方式适合跨Windows/Linux不同环境的场景:
- 直接运行编译好的二进制文件时:
./path/to/your/exe +RTS -N -s/path/to/MyApplication-s.log -h/path/to/MyApplication.hp -i0.1 -p/path/to/MyApplication -M1G -S/path/to/MyApplication-S.log -RTS
- 用Stack直接运行项目时:
stack run -- +RTS -N -s/path/to/MyApplication-s.log -h/path/to/MyApplication.hp -i0.1 -p/path/to/MyApplication -M1G -S/path/to/MyApplication-S.log -RTS
额外提示
- 无论用哪种方式,都要确保指定的目录存在且程序有写入权限,否则还是会出现“Can't open ... file...”错误
- 注意
-p选项的路径是文件前缀,GHC会自动添加.prof后缀;而-h、-s、-S是直接指定完整文件名,记得带上对应的后缀
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

