给定一个使用 OCaml 编译的二进制文件,有没有办法找出它是否已使用分析信息(使用ocamlcp
/ocamloptp
或使用gprof
特定数据 via ocamlopt -p
)进行编译?
问问题
119 次
2 回答
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
.
于 2012-08-08T19:10:34.440 回答
1
注意:旧的分析标志 ( ocamlopt -p
) 会产生gprof
- 特定信息,并且不会camlProfiling
像 Jeffrey 的回答那样产生符号。但是使用ocamloptp
,他的解决方案有效。
如果您需要“旧”方法,如本网站所示,确定二进制文件是否已在gprof
支持下编译的一种比较可靠的方法是检查符号的存在mcount
:
nm <native binary> | grep mcount
只有编译的程序-p
应该包含mcount
符号:
U mcount@@GLIBC_2.2.5
否则,程序尚未使用该-p
标志编译。
于 2015-07-03T16:29:46.657 回答