OCaml でコンパイルされたバイナリ ファイルが与えられた場合、プロファイル情報を使用してコンパイルされているかどうかを確認する方法はありますか ( ocamlcp
/を使用するかocamloptp
、または をgprof
介して特定のデータを使用してocamlopt -p
)。
質問する
119 次
2 に答える
2
プロファイリングされたバイトコード ファイルで実行するocamlobjinfo
と、プロファイリングがインポートされたインターフェイスの 1 つとして表示されます。
$ 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
しかし、 を使用するocamloptp
と、彼のソリューションは機能します。
この Web サイトに示されているように、「古い」方法が必要な場合、バイナリがサポート付きでコンパイルされているかどうかを特定するある程度信頼できる方法はgprof
、シンボルの存在を確認することですmcount
。
nm <native binary> | grep mcount
でコンパイルされたプログラムのみにシンボル-p
を含める必要があります。mcount
U mcount@@GLIBC_2.2.5
それ以外の場合、プログラムは-p
フラグを使用してコンパイルされていません。
于 2015-07-03T16:29:46.657 に答える