[Erlang_Question 26]beamファイルからすべてのrecordまたはソースコードを取得するにはどうすればいいですか?
4008 ワード
どのようにbeamファイルを通じてすべてのrecordあるいはソースコードを得ますか?
1.まずはcompileにdebug_を付けなければなりませんinfo情報:
2.beamからbeam_を通過libモジュールはrecod情報またはソースコードを取り出します.
3.テスト:recordとソースファイルを取得する:
すべての前提はコンパイル時+debug_info情報:
デブを追加したくないからinfoはコードを漏らすが、いくつかのテストツールはdebugに非常に依存している.info.
encryptionを使用してdebug_infoは暗号化されています.詳細はbeam_を参照してください.libの公式ドキュメント:)
参照:beam_libモジュールの公式ドキュメント.
--------------------------------------------------------------------------------------------------------------------------------------
人の手が出てきたのに,どうやら小さな魚にやらせたのか,これは人がやったのか.
1.まずはcompileにdebug_を付けなければなりませんinfo情報:
1 > c(load,[debug_info]).
{ok,load}
2> beam_lib:chunks(code:which(load),[compile_info]).
{ok,{load,[{compile_info,[{options,[debug_info]},
{version,"5.0.2"},
{time,{2014,11,10,15,19,43}},
{source,"c:/Users/admin/Documents/GitHub/ErlMixCode/src/load/load.erl"}]}]}}
2.beamからbeam_を通過libモジュールはrecod情報またはソースコードを取り出します.
-module(beamI).
%% API
-export([record_attrs/1,beam_to_source/1]).
%% record [{RecName1,[Filed11,Filed12]},{RecName2,[Filed21,Filed22]}]
record_attrs(Beam) ->
{ok,{_Mod,[{abstract_code,{_Version,Forms}},{"CInf",_CB}]}} =
beam_lib:chunks(code:which(Beam), [abstract_code,"CInf"]),
[join_name_field(D) || {attribute,_,record,D} <- Forms].
%% Beam.erl :
beam_to_source(Beam) ->
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(code:which(Beam),[abstract_code]),
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
join_name_field({Name, Fs}) -> {Name, [element(3, element(3,F)) || F <- Fs]}.
3.テスト:recordとソースファイルを取得する:
3> beamI:record_attrs(mnesia).
[{tid,[counter,pid]},
{tidstore,[store,up_stores,level]},
{cstruct,[name,type,ram_copies,disc_copies,disc_only_copies,
load_order,access_mode,majority,index,snmp,local_content,
record_name,attributes,user_properties,frag_properties,
storage_properties,cookie,version]},
{log_header,[log_kind,log_version,mnesia_version,node,now]},
{commit,[node,decision,ram_copies,disc_copies,
disc_only_copies,snmp,schema_ops]},
{decision,[tid,outcome,disc_nodes,ram_nodes]},
{cyclic,[node,oid,op,lock,lucky]},
{mnesia_select,[tab,tid,node,storage,cont,written,spec,type,
orig]}]
4> beamI:beam_to_source(load).
-file("load.erl", 1).
-module(load).
-behaviour(gen_server).
-vsn("1.0").
-export([multi_start/0, multi_start/1, start/0, start/1,
start_link/0, start_link/1]).
-export([stop/0, multi_stop/0]).
.......
すべての前提はコンパイル時+debug_info情報:
デブを追加したくないからinfoはコードを漏らすが、いくつかのテストツールはdebugに非常に依存している.info.
encryptionを使用してdebug_infoは暗号化されています.詳細はbeam_を参照してください.libの公式ドキュメント:)
参照:beam_libモジュールの公式ドキュメント.
--------------------------------------------------------------------------------------------------------------------------------------
人の手が出てきたのに,どうやら小さな魚にやらせたのか,これは人がやったのか.