外部用語形式の文書化されていない機能を使用して、すべての原子を保持することができます。
外部用語形式でエンコードされたErlangの用語は、バイト131、次にタイプを識別するバイト、そして実際のデータで始まります。 EEP-43にはATOM_INTERNAL_REF3
(バイトタイプ75)という可能なタイプがすべて記載されていますが、これはofficial documentation of the external term formatには記載されていません。
ATOM_INTERNAL_REF3
の場合、データはアトムテーブルへのインデックスであり、24ビット整数としてエンコードされます。私たちは、簡単なバイナリを作成することができます。たとえば<<131,75,N:24>>
を、私のErlangのVMで、false
はアトムテーブルのゼロ番目の原子のようだ:
> binary_to_term(<<131,75,0:24>>).
false
原子の数を見つけるための簡単な方法はありません現在原子表*にありますが、badarg
エラーが発生するまで番号を増やすことができます。
だから、この小さなモジュールは、あなたのすべての原子のリストを与える:出力がどのように見える
-module(all_atoms).
-export([all_atoms/0]).
atom_by_number(N) ->
binary_to_term(<<131,75,N:24>>).
all_atoms() ->
atoms_starting_at(0).
atoms_starting_at(N) ->
try atom_by_number(N) of
Atom ->
[Atom] ++ atoms_starting_at(N + 1)
catch
error:badarg ->
[]
end.
:
のErlang/OTP 20.0で
> all_atoms:all_atoms().
[false,true,'_',[email protected],'$end_of_table','','fun',
infinity,timeout,normal,call,return,throw,error,exit,
undefined,nocatch,undefined_function,undefined_lambda,
'DOWN','UP','EXIT',aborted,abs_path,absoluteURI,ac,accessor,
active,all|...]
> length(v(-1)).
9821
*、あなたが呼び出すことができますerlang:system_info(atom_count)
:
まあ、私はおそらく周りにクラッシュダンプを持っているので、それは悪い方法ではないです。たぶん、私はerlangのソースを掘り下げ、それがどのようにそれを得るのかを見ていきます。ちょっと創造的なハッカーで、多分私はライブコンソールから入ることができます。 – Sniggerfardimungus
Recon https://github.com/ferd/reconは、クラッシュダンプの解析をサポートしています。 – rvirding