使用分析信息编译的OCaml二进制文件

时间:2012-08-08 18:51:41

标签: profiling ocaml

鉴于使用OCaml编译的二进制文件,有没有办法找出它是否已使用分析信息进行编译(使用ocamlcp / ocamloptpgprof - 具体数据通过ocamlopt -p)?

2 个答案:

答案 0 :(得分:2)

如果在配置文件的字节码文件上运行ocamlobjinfo,它会将Profiling显示为导入的接口之一:

$ ocamlcp -c my.ml
$ ocamlobjinfo my.cmo
File my.cmo
Unit name: My
Interfaces imported:
        720848e0b508273805ef38d884a57618    Array
        d7e1aaf95ba3578d33efe347aefa6c49    My
        db723a1798b122e08919a2bfed062514    Pervasives
        6a6248bae49664a0bb530dd3f0c15b79    Profiling
Uses unsafe features: no
$ 

<强>更新

在我的系统上(OS X)配置文件的本机可执行文件包含camlProfiling及相关符号的定义:

$ ocamlopt -o my my.ml
$ nm my | grep camlProfiling
$ ocamloptp -o my my.ml
$ nm my | grep camlProfiling
000000010003e240 D _camlProfiling
000000010003e2e0 d _camlProfiling__1
000000010003e300 d _camlProfiling__2
000000010003e318 d _camlProfiling__3
000000010003e268 d _camlProfiling__4
000000010003e280 d _camlProfiling__5
000000010003e2a0 d _camlProfiling__6
000000010003e2c0 d _camlProfiling__7
0000000100003760 T _camlProfiling__code_begin
0000000100003ac7 T _camlProfiling__code_end
000000010003e238 D _camlProfiling__data_begin
000000010003e328 D _camlProfiling__data_end
00000001000038d0 T _camlProfiling__dump_counters_1014
0000000100003a40 T _camlProfiling__entry
000000010003e32c D _camlProfiling__frametable
0000000100003770 T _camlProfiling__fun_1046
0000000100003800 T _camlProfiling__fun_1048
0000000100003890 T _camlProfiling__incr_1010

这似乎很可能适用于支持nm的每个系统。

答案 1 :(得分:0)

注意:旧的分析标记(ocamlopt -p)生成gprof - 特定信息,并且不会像Jeffrey的答案中那样生成camlProfiling个符号。但是使用ocamloptp,他的解决方案可行。

如果您需要“旧”方法,如this website所示,确定是否已使用gprof支持编译二进制文件的一种可靠方法是检查是否存在符号{{ 1}}:

mcount

只有使用nm <native binary> | grep mcount 编译的程序才应包含-p符号:

mcount

否则,程序尚未使用U mcount@@GLIBC_2.2.5 标志进行编译。