Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53

Дамп динамической памяти (Heap)

14.05.2014, 09:35. Показов 5382. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, как можно получить дамп пользовательского Heap. С помощью каких средств?
Heap создается в программе и надо получить его дамп. Heap я создал, а вот получить дамп не выходит.

Добавлено через 23 часа 8 минут
Если кто-нибудь знает подскажите, пожалуйста. Нужно получить дамп, а сделать это не выходит, поиск ничего не дал.

Добавлено через 15 часов 48 минут
Можно ли при помощи Toolhelp32ReadProcessMemory вывести дамп?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2014, 09:35
Ответы с готовыми решениями:

Оператор delete[]. Как исправить ошибку: Error HEAP CORRUPTED. Откуда утечка памяти?
Код функции: void SeeAllTimesAllProcs() { HANDLE SnapHNDL = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32...

Найти сигнатуру в динамической памяти
Доброго времени суток, есть код трейнера с поиском сигнатур, но проблема в том, что ищет сигнатуры только в исполняемой памяти, до...

Определение размера динамической памяти, используемой процессом
Доброго всем времени суток! В общем задача следующая... Я, с помощь функции CreateProcess() создаю новый процесс (консольное приложение)....

24
Заблокирован
14.05.2014, 11:09
а вот по этому поводу моя же тема в этой ветке, там есть ответ Как получить дамп памяти программы, чтоб потом можно было его сохранить и проанализировать?
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
14.05.2014, 11:23  [ТС]
Спасибо, видел просто с минидампом не большие проблемы, выводит состояние регистров и не более, и пока пытаюсь решить, хотел поинтерисоватся есть ли другие способы
0
Заблокирован
14.05.2014, 11:28
Цитата Сообщение от DEMONICK Посмотреть сообщение
хотел поинтерисоватся есть ли другие способы
ну это к Убеждённому
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
14.05.2014, 17:08
Не совсем понял.. это нужно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <Windows.h>
 
bool  DumpMemoryA(HANDLE hProcess, LPVOID MemoryStart, ULONG_PTR MemorySize, char* szDumpFileName);
 
int main() {
 
 
#ifdef _WIN64
    MEMORY_BASIC_INFORMATION64 info;
#else
    MEMORY_BASIC_INFORMATION32 info;
#endif
 
    VirtualQueryEx(GetCurrentProcess(), GetProcessHeap(), reinterpret_cast<PMEMORY_BASIC_INFORMATION>(&info), sizeof(info) );
 
    char buff[256];
 
    printf("[%016X - %016X]\n", info.BaseAddress, (info.BaseAddress + info.RegionSize));
    sprintf(buff, "%016X_%016X.dmp", info.BaseAddress, info.BaseAddress + info.RegionSize);
    DumpMemoryA(GetCurrentProcess(), reinterpret_cast<LPVOID>(info.BaseAddress), info.RegionSize, buff);
 
    return 0;
}
 
bool  DumpMemoryA(HANDLE hProcess, LPVOID MemoryStart, ULONG_PTR MemorySize, char* szDumpFileName)
{
 
    ULONG_PTR ueNumberOfBytesRead = 0;
    DWORD uedNumberOfBytesRead = 0;
    HANDLE hFile = 0;
    LPVOID ReadBase = MemoryStart;
    ULONG_PTR ProcReadBase = (ULONG_PTR)ReadBase;
    LPVOID ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
 
#ifdef _WIN64
    MEMORY_BASIC_INFORMATION64 MemInfo;
#else
    MEMORY_BASIC_INFORMATION32 MemInfo;
#endif
 
    hFile = CreateFileA(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
 
    if( hFile != INVALID_HANDLE_VALUE )
    {
        while( MemorySize > NULL )
        {
            ReadBase = (LPVOID)ProcReadBase;
 
            RtlZeroMemory(ueCopyBuffer,0x1000);    
 
            if( MemorySize >= 0x1000 )
            { 
 
                if( !ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, 0x1000, &ueNumberOfBytesRead) )
                {
                    VirtualQueryEx(hProcess, ReadBase,  reinterpret_cast<PMEMORY_BASIC_INFORMATION>(&MemInfo), sizeof MemInfo);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, PAGE_EXECUTE_READWRITE, &MemInfo.Protect);
                    ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, 0x1000, &ueNumberOfBytesRead);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, MemInfo.Protect, &MemInfo.Protect);
                }
 
                WriteFile(hFile,ueCopyBuffer, 0x1000, &uedNumberOfBytesRead, NULL);
                MemorySize = MemorySize - 0x1000;
 
            }
            else
            {
                
                if( !ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, MemorySize, &ueNumberOfBytesRead) )
                {
                    VirtualQueryEx(hProcess, ReadBase,  reinterpret_cast<PMEMORY_BASIC_INFORMATION>(&MemInfo), sizeof MemInfo);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, PAGE_EXECUTE_READWRITE, &MemInfo.Protect);
                    ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, 0x1000, &ueNumberOfBytesRead);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, MemInfo.Protect, &MemInfo.Protect);
                }
 
                WriteFile(hFile, ueCopyBuffer, (DWORD)MemorySize, &uedNumberOfBytesRead, NULL);
                MemorySize = NULL;
            }
 
            ProcReadBase = (ULONG_PTR)ReadBase + 0x1000;
        }
 
        CloseHandle(hFile);
        VirtualFree(ueCopyBuffer, NULL, MEM_RELEASE);
 
        return true;
    }
    else
    {
        VirtualFree(ueCopyBuffer, NULL, MEM_RELEASE);
 
        return false;
    }
 
    return true;
}
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
14.05.2014, 17:42  [ТС]
Не совсем, MEMORY_BASIC_INFORMATION использует же только виртуальную память, которая выделяется через VirtualAlloc, а мне бы как-то вывести именно heap. Тоесть я создаю его HeaCreate, выделяю память HeapAlloc и надо чтобы в этом дампе была вот эта куча, под которую я выделил память
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
14.05.2014, 18:16
Попробуй воспользоватся HeapWalk http://msdn.microsoft.com/en-u... s.85).aspx
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
14.05.2014, 18:21
Не совсем, MEMORY_BASIC_INFORMATION использует же только виртуальную память, которая выделяется через VirtualAlloc, а мне бы как-то вывести именно heap. Тоесть я создаю его HeaCreate, выделяю память HeapAlloc и надо чтобы в этом дампе была вот эта куча, под которую я выделил память
А где HeapCreate память берет? так или иначе выделит виртуальную память тем же VirtualAlloc (или ZwAllocateVirtualMemory)..
1
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
14.05.2014, 18:59  [ТС]
Celly, Пользовался, но это не дамп
ISergey, ну а вроде же MEMORY_BASIC_INFORMATION не видит страницы выделенной под heap
Я создал heap размером 1024 байта, но такого размера я не нашел в выводе
Миниатюры
Дамп динамической памяти (Heap)  
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
14.05.2014, 19:07
Я создал heap размером 1024 байта, но такого размера я не нашел в выводе
Память выделяется постранично. Размер страницы 4096 байт.
Узнать размер страницы можно функцией GetSystemInfo
1
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
15.05.2014, 12:04  [ТС]
Мне нужно отобразить дамп такого вида, возможно ли это сделать?
Миниатюры
Дамп динамической памяти (Heap)  
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 10:16  [ТС]
Если это осуществимо то хоть примерно, какими функциями нужно воспользоватся?

Добавлено через 15 часов 25 минут
Помогите, пожалуйста, задача следующая: я ввожу адрес и с этого адреса выводится дамп. Такое возможно сделать?
0
Заблокирован
16.05.2014, 10:57
Цитата Сообщение от DEMONICK Посмотреть сообщение
я ввожу адрес и с этого адреса выводится дамп
ну вводишь адрес, а длину чтения памяти не забыл указать?
Используй ReadProcessMemory, указывай хэндл собственного процесса, указывай адрес и размер и читай чё хочешь, если конечно у тебя есть доступ к памяти процесса (PROCESS_VM_READ)
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 14:18  [ТС]
Читаю память собственного процесса по адресу выделенной памяти. Так?
C++
1
2
3
ReadProcessMemory(GetCurrentProcess(),pMemHeap,bufff,sizeof(bufff),NULL);
            
                SendDlgItemMessageA(hDlg,IDC_HEAP,LB_ADDSTRING,0,(LPARAM)bufff);
0
Заблокирован
16.05.2014, 14:21
Цитата Сообщение от DEMONICK Посмотреть сообщение
sizeof(bufff)
это вернёт ровно 4, т.к. ты узнаешь размер указателся
Цитата Сообщение от DEMONICK Посмотреть сообщение
Так?
ну вроде так, а что, не получается?
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 14:50  [ТС]
Буфер этот у меня объявлен как LPVOID bufff[256]
В него ничего больше не записывается, а ниже у меня обработчик кнопки которая освобождает выделеную память, и после того как читаю память мне почему то выводит сообщение что выделенная память освобождена хотя там и тут 2 разных буфера(код чуть позже приведу, если надо)
0
Заблокирован
16.05.2014, 15:59
код покажи

Добавлено через 1 час 1 минуту
Ладно, накатал тебе пример, в нём читаются из памяти процесса переменные, записанные туда в статике (в динами будет тоже самое, это просто что б тебе понятней было), хотя основные приёмы и функции тебе уже показал в 5-м посте ISergey, в том числе показал и то, что делать, если ReadProcessMemory не читает память, в общем вот - запускай, смотри и изучай. (когда будешь копировать в новый проект, не забудь отключить прекомпайл хедеры )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <tchar.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <string>
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "-=Initial Data=-" << std::endl;
 
    const SIZE_T checkSize = 3; 
    int checkData[checkSize];
 
    for(int i = 0; i < checkSize; i++)
    {
        checkData[i] = i + 1;       
        std::cout << "checkData[" << i << "] = " << checkData[i] << std::endl;
    }
 
    std::cout << std::endl;
 
    LPVOID resultData = new LPVOID[checkSize * sizeof(int)];    
 
    HANDLE hCurrentProc = GetCurrentProcess();
    if(hCurrentProc)
    {
        std::cout << "-=Result Data=-" << std::endl;
        SIZE_T bytesRead;       
        BOOL retVal = ReadProcessMemory(hCurrentProc, checkData, resultData, checkSize * sizeof(int), &bytesRead);
        if(retVal && bytesRead == checkSize * sizeof(int))
        {
            int *resultInts = new int[checkSize];
            int *workPointer = resultInts;
            memcpy_s(resultInts, checkSize * sizeof(int), checkData, checkSize * sizeof(int));
            for(int i = 0; i < checkSize; i++)                      
                std::cout << "resultData[" << i << "] = " << *workPointer++ << std::endl;
            
            delete[] resultInts;
        }
    }
    else
        std::cout << "Memory read error!" << std::endl;
 
    delete[] resultData;
 
    system("pause");
    
    return 0;
}
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 20:37  [ТС]
Блин я все равно не очень понял, я считываю 20 байт, они считались, судя по тому что мне вывело 20 строк в листбоксе. Но строки пустые т.е мне вывело 20 пустых строк
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case IDC_BUTTON1:
                    if (hCurProc)
                    {
                         VirtualQueryEx(hCurProc,pMemHeap,&memBasicInfo,sizeof(MEMORY_BASIC_INFORMATION));
                        pBuffer = new BYTE[20];
                        ReadProcessMemory(hCurProc,pMemHeap,pBuffer,20,&bytesRead);
                    }   
                    
                    if(bytesRead == 20)
        {
            for(int i = 0; i < 20; i++) 
            {
               SendDlgItemMessageA(hDlg, IDC_HEAP, LB_ADDSTRING, NULL, (LPARAM)pBuffer); 
            
             }
             }
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
17.05.2014, 00:13  [ТС]
Если сделать с начального адреса региона то вроде бы выводит, но выводит одно и тоже значение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
сase IDC_BUTTON1:
                    if (hCurProc)
                    {
                         VirtualQueryEx(hCurProc,pMemHeap,&memBasicInfo,sizeof(MEMORY_BASIC_INFORMATION));
                         pBuffer = new BYTE[memBasicInfo.RegionSize];
                         ReadProcessMemory(hCurProc,memBasicInfo.BaseAddress,pBuffer,memBasicInfo.RegionSize,&bytesRead);
                        
                    
                        if(bytesRead == si.dwPageSize)
        {
            for(int i = 0; i < 30; i++) 
            {
                sprintf (buff,"Буфер %lx\r\n",pBuffer);
               SendDlgItemMessageA(hDlg, IDC_HEAP, LB_ADDSTRING, NULL, (LPARAM)buff); 
            
             }
             }
                    }
Миниатюры
Дамп динамической памяти (Heap)  
0
Заблокирован
17.05.2014, 06:49
Я уже устал тут многим повторять, ты что, секретарша? Я даже ну беду вчитываться в твой код, тебе уже всё тут пояснили... Мне просто лень. Ты слыхал о таком понятие как минимальный вопрос на форуме? А о таком, который тут все используют активно в разделе С++ для начинающих - напиши код за меня ))) ?

Если ты такой не проницаемый и у тебя остались вопросы, ну тогда уж я не знаю - прикрепляй сюда проект в архиве - так и быть - гляну за тебя нубарь (хотя ник у меня такой же ) и ГЛАВНОЕ - не забудь указать, что конкретно тебя не устраивает или что у тебя не получается - твой проект посмотрю в понедельнеГ Г Г Г )))))) (а пока что - )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2014, 06:49
Помогаю со студенческими работами здесь

Инспектор динамической памяти процессов
Здравствуйте! Помогите пожалуйста. Нужно сделать &quot;Инспектор динамической памяти процессов&quot;. Может у кого-нибудь есть что-нибудь?

Распределение памяти под Stack и Heap
Подскажите пожалуйста, правильно ли я понимаю что при использовании функций malloc или calloc необходимо выделять память именно в куче...

Должен ли общий объем графической памяти складываться из зарезервированной (фиксированной) памяти и динамической (DVMT)?
Здравствуйте. Скажите, должен ли общий объем графической памяти складываться из зарезервированной (фиксированной) памяти и динамической...

Хранение переменных в HEAP (устройство Stack и Heap)
Добрый день. Проблемы с устройством памяти стека и кучи: если я создаю объект vanya класса Person, с приватными переменными int age, high,...

Выделение памяти и ошибка Heap block at 00B515A0 modified at 00B515B9 past requested size of 11
Доброго времени суток! есть такой кусок кода: size_t read_lines(char ***lines) { typedef char* line_t; line_t *l =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru