2016-05-03 14 views
1

Gibt es eine Möglichkeit, Informationen über den virtuellen Speicher zu erhalten, den meine Anwendung verwendet?Informationen zum virtuellen Speicher, den mein Programm verwendet?

Soweit ich bin bewusst, dass es mehrere Speichersegmente sind, die ein Programm, wie zum Beispiel Codesegment, Datensegmente und der Heap verwendet, Stapel usw.

Gibt es eine Möglichkeit ich Informationen über das bekommen Adressen, wo diese Segmente beginnen und enden?

Um einen Kontext zu geben, versuche ich ein Bild zu zeichnen, das eine visuelle Darstellung des virtuellen Speichers meines Programms enthält (eine Art Graph). Also brauche ich die Start- und Endadressen der verschiedenen Segmente, und wenn möglich, kann man feststellen, ob gerade eine Adresse im Speicher ist.

Ich benutze C++ auf Windows BTW.

+0

Ich erinnere mich an meinen Professor schreiben ein Programm, das SIGSEGVs fängt und dann geht und greift auf Adressen von Vielfachen von 4kBs oder so. Dies gibt Ihnen nur Informationen darüber, welche Adressen lesbar sind, und ich bin nicht sicher, wie es unter Windows funktioniert. –

+0

Sie müssen genauer sein, was Sie suchen. Wenn Sie 32-Bit-Fenster verwenden, verwenden Sie 2^32 Byte virtuellen Speicher. Wenn Sie 64-Bit-Fenster verwenden, verwenden Sie 2^64 Byte VIRTUAL-Speicher (und sogar logischen Speicher). Sprechen Sie über die Größe des Arbeitssatzes? Wie viele logische Seiten wurden zugeordnet? – user3344003

+0

Es gibt nichts auf der Sprachebene, um dies zu bestimmen. Sie müssen OS-spezifische Bibliotheken verwenden, um den Zustand Ihres Betriebssystems und den Status der Prozesse abzufragen. –

Antwort

1

Sie können das Speicherlayout eines Prozesses abfragen, indem Sie VirtualQueryEx aufrufen. Es gibt das von Ihnen gewünschte Speicherkartenlayout zurück.

Die zurückgegebene MEMORY_BASIC_INFORMATION Tabelle Liste der Speicherbereiche mit ihren Schutzattributen.

jedoch die Maschine über den Schutz funktioniert Attribute, die nicht von Natur aus (Code, Daten, Rodata, bss, Haufen, usw.), können Sie nur erraten auf sie:

  • PAGE_EXECUTE: Code
  • PAGE_READONLY: Rodata
  • PAGE_READWRITE: Daten, bss, Heap, Stack
  • PAGE_WRITECOPY: Daten, bss, Heap, Stack

Die obige Schätzung wäre jedoch nicht zuverlässig, wenn der Prozess eigene angepasste VirtualAllocate oder Dateizuordnung hat. Um die Genauigkeit zu erhöhen, können Sie auch den Namen der ausführbaren Datei mit GetModuleFileName abfragen und die Datei analysieren und dann mit der Tabelle vergleichen Raum Randomisierung)

+0

Danke, haben Sie Beispiele dafür, wie dies verwendet wird? Wenn ich es benutze, ist die Information, die es zurückgibt, nicht so hilfreich? jede Hilfe wird geschätzt. –