2012-08-08 98 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編譯落後。