2012-08-08 60 views
3

考虑到与OCaml的编译的二进制文件编译的,有没有办法找出是否已经编有分析信息(通过使用ocamlopt -pocamlcp/ocamloptp,或gprof特异性数据)?OCaml的二进制与分析信息

回答

2

如果你运行一个异形字节码文件ocamlobjinfo,它显示了剖析作为进口接口之一:

$ 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 

看来很可能这个w在支持nm的每个系统上都生病了。

+0

谢谢!确实适用于字节码版本。任何想法的本地二进制文件? – anol 2012-08-08 19:16:12

+0

刚才我正在研究它,但是我没有'ocamloptp'(OCaml 3.12.1)。也许它在OCaml 4中是新的? – 2012-08-08 19:19:18

+1

我刚刚检查过,是的,它是一个新工具,虽然文档没有说清楚它(如果您使用“增强的文档”来提供不同版本之间的差异,它变得很清楚:http://www.askra。德/软件/ ocaml的-DOC/4.00 /)。现在,我会尝试使用“ocamlopt -p”。 – anol 2012-08-08 19:22:30

0

注意:老谱标志(ocamlopt -p)产生gprof特定信息,且不会产生camlProfiling的符号,杰弗里的答案。但使用ocamloptp,他的解决方案工作。

如果你需要“旧”方法,如this website指出的,有些可靠的方式来确定是否二进制已编译gprof支持是检查符号mcount的存在:

nm <native binary> | grep mcount 

只有-p编译的程序应该包含mcount符号:

U [email protected]@GLIBC_2.2.5 

否则,该方案尚未使用-p˚F编译落后。