2 Stimmen

Gibt es eine Möglichkeit, festzustellen, welcher Speichertyp die von VirtualQuery() zurückgegebenen Segmente sind?

Grüße,

Ich bin in der Lage, einen Prozess-Speicherplan mit dieser Logik zu durchlaufen:

    MEMORY_BASIC_INFORMATION mbi;
    void *lpAddress=(void*)0;
    while (VirtualQuery(lpAddress,&mbi,sizeof(mbi))) {
        fprintf(fptr,"Mem             base:%-10x start:%-10x Size:%-10x Type:%-10x State:%-10x\n",
            mbi.AllocationBase,
            mbi.BaseAddress,
            mbi.RegionSize,
            mbi.Type,mbi.State);
        lpAddress=(void *)((unsigned int)mbi.BaseAddress + (unsigned int)mbi.RegionSize);
    }

Ich würde gerne wissen, ob ein bestimmtes Segment für statische Zuweisung, Stack und/oder Heap und/oder andere verwendet wird?

Gibt es eine Möglichkeit, dies festzustellen?

0voto

Michael Punkte 52790

Ich bin neugierig, was Sie mit diesen Informationen zu tun gedenken.

Es gibt eine windbg-Erweiterung, !address, die Ihnen diese Informationen liefern kann, wenn Sie keinen Code dafür benötigen. Ein Skript für den Debugger wird wahrscheinlich viel zuverlässiger sein, um diese Informationen zu erhalten.

VirtualQuery kann Ihnen diese Informationen nicht selbst zurückgeben, da es keine Ahnung hat, warum der Benutzermoduscode den Speicher angefordert hat. Sie müssen es mit anderen Informationsquellen verwenden, um diese Informationen zu erhalten, und es kann immer noch einige Fehlerfälle geben.

Zunächst sollten Sie nur nach MEM_PRIVATE-Speicher filtern Heap-, Stack- und statische Zuweisungen (sofern sie geändert wurden) sollten in diesen Bereich fallen.

Statische Zuweisungen (Globals usw.) sollten an einer Adresse mit einem geladenen Modul liegen. Sie können PSAPI verwenden, um festzustellen, ob die Adresse in einem geladenen Modul liegt, indem Sie z.B. EnumProcessModules und dann GetModuleInformation aufrufen.

Stack-Werte, können Sie die toolhelp-API verwenden, um festzustellen, ob sich der Speicherplatz in einem Stack befindet. CreateToolhelp32Snapshot mit TH32CS_SNAPSHOT, um Threads im Zielprozess zu erhalten, dann GetThreadContext und prüfen, ob der resultierende Stapelzeiger innerhalb des Segments liegt.

Ich kenne keinen guten Weg, um Haufen von außerhalb des Prozesses zu gehen. Toolhelp schnappt sich eine Heap-Liste, aber gibt Ihnen keinen guten Satz von Grenzen für den Heap-Speicher. Innerhalb des Prozesses können Sie GetProcessHeaps verwenden, um die Liste der Heaps zu durchsuchen, und dann HeapValidate aufrufen, um festzustellen, ob der Speicherplatz innerhalb des Heaps liegt.

0 Stimmen

Verwendung dieser Informationen als Teil eines benutzerdefinierten Speichermanagers für eine Anwendung.

0 Stimmen

Die Stackseite/Speicherregion scheint MEM_IMAGE und nicht MEM_PRIVATE? zu sein.

0 Stimmen

Die Stapel sind definitiv privat. Wie erhalten Sie die Stapeladresse, die Sie überprüfen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X