2012-11-20 18 views
7

Mój projekt został przedmuchany przez atomy o maksymalnej wielkości 1M, przekroczyliśmy limit, ale muszę zastosować pewne środki ostrożności do kodu, który ludzie przesyłają w odniesieniu do list_to_atom i jego przyjaciół. Chciałbym zacząć od uzyskania listy wszystkich zarejestrowanych atomów, abym mógł zobaczyć, gdzie znajdują się najwięksi przestępcy. Czy jest jakikolwiek sposób to zrobić? Będę musiał być kreatywny w tym, jak to robię, więc nie próbuję zrzucić 1-2M linii w konsoli na żywo.Erlang: Czy mogę uzyskać listę wszystkich obecnie zarejestrowanych atomów?

Dzięki.

Odpowiedz

5

Nie jestem pewien, czy istnieje sposób, aby to zrobić w systemie na żywo, ale jeśli można go uruchomić w środowisku testowym, powinieneś być w stanie uzyskać listę poprzez zrzut awaryjny. Tablica atomów jest bliska końca crash dump format. Możesz utworzyć zrzut awaryjny za pomocą erlang:halt/1, ale to obniży cały system runtime.

+1

No cóż, prawdopodobnie leżę na podłodze, więc nie jest to zła droga. Może zagłębię się w źródło erlang i zobaczę, jak to się dzieje. Przy odrobinie kreatywnego hackery, może uda mi się wejść z konsoli na żywo. – Sniggerfardimungus

+1

Recon https://github.com/ferd/recon ma wsparcie dla parsowania zrzutu awaryjnego. – rvirding

0

edytować (zła odpowiedź ..)

można regulować liczbę atomów z +t

http://www.erlang.org/doc/efficiency_guide/advanced.html

..ale wiem bardzo niewiele przypadków użycia, gdy jest to konieczne.

Możesz śledzić statystyki atomu erlang:memory()

+1

Czy nie jest 'erlang: zarejestrowany/0' tylko dla zarejestrowanych procesów/portów? Nie wierzę, że zrzuca cały stół atomowy; tzn. nie myśl, że wywołanie "list_to_atom" spowoduje dodanie tej listy. – Tadmas

+0

masz rację .. Tęsknię zrozumiałem pytanie – user425720

+0

dodał kilka wskazówek, może pomocne – user425720

3

Śmiem twierdzić, że jeśli używasz więcej niż atomów 1M, następnie robisz coś złego. Atomy mają być statyczne natychmiast po uruchomieniu aplikacji lub co najmniej w górnej ograniczonej przez niewielką liczbę, około 3000 w przypadku aplikacji średniej wielkości.

Bądź ostrożny, gdy wróg może generować atomy w twoim wm. w szczególności wywołania takie jak list_to_atom/1 są dość niebezpieczne.

+0

Tak, jeśli masz więcej niż 10^6 atomów w erlangu robisz coś naprawdę złego –

26

Możesz zdobyć wszystkie atomy za pomocą nieudokumentowanej funkcji formatu terminu zewnętrznego.

Termin Erlanga zakodowany w formacie warunków zewnętrznych zaczyna się od bajtu 131, następnie bajtu identyfikującego typ, a następnie rzeczywistych danych. Zauważyłem, że EEP-43 wymienia wszystkie możliwe typy, w tym ATOM_INTERNAL_REF3 z bajtem typu 75, który nie jest wymieniony w official documentation of the external term format.

Dla ATOM_INTERNAL_REF3 dane są indeksem do tabeli atomów zakodowanymi jako 24-bitowa liczba całkowita. Możemy łatwo stworzyć taki plik binarny: <<131,75,N:24>>

Na przykład w moim Erlang VM false wydaje się być atom zerowego w tabeli Atom:

> binary_to_term(<<131,75,0:24>>). 
false 

Nie ma prosty sposób na znalezienie liczbę atomów obecnie w tabeli atomów *, ale możemy ciągle zwiększać liczbę, dopóki nie otrzymamy błędu badarg.

Więc ten mały moduł daje listę wszystkich atomów:

-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. 

Wyjście wygląda następująco:

> 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 

* W Erlang/OTP 20,0, możesz zadzwonić erlang:system_info(atom_count):

> length(all_atoms:all_atoms()) == erlang:system_info(atom_count). 
true 
+1

To jest fajna sztuczka! (http://www.relatably.com/m/img/clever-girl-meme-gif/fa3e19ffd513583d5f7ae60382262d9a0505d72589cd2374af2b2a7de75e057d.jpg) – RichardC

Powiązane problemy