Erlang: Kann ich eine Liste aller aktuell registrierten Atome bekommen?

7

Mein Projekt hat die maximal 1M Atome durchgebrannt, wir haben die Grenze überschritten, aber ich muss den Code, den Leute bezüglich list_to_atom und ihren Freunden einreichen, vernünftig anwenden. Ich möchte damit beginnen, eine Liste aller registrierten Atome zu bekommen, damit ich sehen kann, wo die größten Täter sind. Gibt es einen Weg dies zu tun? Ich muss kreativ sein, wie ich es mache, also versuche ich nicht, 1-2M Zeilen in einer Live-Konsole auszugeben.

Danke.

    
Sniggerfardimungus 20.11.2012, 19:16
quelle

4 Antworten

5

Ich bin nicht sicher, ob es eine Möglichkeit gibt, es auf einem Live-System zu tun, aber wenn Sie es in einer Testumgebung ausführen können, sollten Sie in der Lage sein, eine Liste über Crash-Dump zu bekommen. Die Atomtabelle befindet sich nahe am Ende des Crash-Dump-Formats . Sie können einen Crash-Dump über erlang: halt / 1 erstellen, aber das wird das ganze herunterbringen Laufzeitsystem.

    
Tadmas 20.11.2012, 21:35
quelle
27

Sie können alle Atome erhalten, indem Sie eine nicht dokumentierte Funktion des externen Termformats verwenden.

Ein Erlang-Ausdruck, der im externen Ausdruckformat codiert ist, beginnt mit dem Byte 131, dann einem Byte, das den Typ identifiziert, und dann mit den tatsächlichen Daten. Ich fand, dass EEP-43 alle möglichen Typen erwähnt, einschließlich ATOM_INTERNAL_REF3 mit Typ Byte 75, die wird nicht in der offiziellen Dokumentation des externen Termformats erwähnt.

Für ATOM_INTERNAL_REF3 sind die Daten ein Index in die Atomtabelle, kodiert als eine 24-Bit-Ganzzahl. Wir können einfach eine solche Binärdatei erstellen: <<131,75,N:24>>

Zum Beispiel scheint false in meiner Erlang-VM das nullte Atom in der Atom-Tabelle zu sein:

%Vor%

Es gibt keine einfache Möglichkeit, die Anzahl der Atome in der Atomtabelle * zu finden, aber wir können die Zahl weiter erhöhen, bis wir einen badarg -Fehler bekommen.

Also dieses kleine Modul gibt Ihnen eine Liste aller Atome:

%Vor%

Die Ausgabe sieht folgendermaßen aus:

%Vor%

* In Erlang / OTP 20.0 können Sie erlang:system_info(atom_count) :

aufrufen %Vor%     
legoscia 19.01.2016 17:31
quelle
3

Ich wage zu sagen, dass wenn Sie mehr als 1M Atome verwenden, dann machen Sie etwas falsch. Atome sollen statisch sein, sobald die Anwendung läuft oder zumindest oben durch eine kleine Zahl begrenzt ist, etwa 3000 für eine mittelgroße Anwendung.

Sei sehr vorsichtig, wenn ein Feind Atome in deiner VM erzeugen kann. besonders Anrufe wie list_to_atom / 1 sind etwas gefährlich.

    
I GIVE CRAP ANSWERS 21.11.2012 18:32
quelle
0

EDITED (falsche Antwort ..)

Sie können die Anzahl der Atome mit +t

einstellen

Ссылка

.. aber ich kenne sehr wenige Anwendungsfälle, wenn es notwendig ist.

Sie können Atomstatistiken mit erlang:memory()

verfolgen     
user425720 20.11.2012 22:11
quelle

Tags und Links