Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2010, 18:19   #1
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию Как отследить используемую память?

В очередной раз здравствуйте. Начал работать с динамической памятью, теперь хочу посмотреть на нее вживую .
То есть, грубо говоря, хочу запускать в дэлфи прогу в режиме отладки (F7 или F8) и каждый раз смотреть на количество памяти, занимаемой прогой. Пробовал через виндавосского диспечера, но или память меняется очень незначительно, или, что более вероятно, он не обновляется так часто, как хотелось бы. Что посоветуете, может есть какая-нибудь альтернатива диспечеру?
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 26.09.2010, 18:22   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

спрашиваем у гугла что такое куча(скорее всего с ней и работаете)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.09.2010, 18:32   #3
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

В основном находит "кучу вопросов по програмированию" . Впрочем, на одном сайте "область нераспределённой памяти при динамическом распределении памяти называется Куча". Не совсем понимаю, как мне это должно помочь. Я впринципе понимаю, как эту "кучу" разгребать, но, как в том анегдоте, хочу убедиться лично. Другими словами, хочу видеть своими глазами, как память сначала заполнилась, а потом освободилась.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 27.09.2010, 08:36   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Попытки написать свой artmoney, но энтузиазм закончился после реализации самого интересного =)

Код:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <conio.h>
int EnumerateProcs(void)
{
	HANDLE pSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	bool bIsok = false;
	PROCESSENTRY32 ProcEntry;
	ProcEntry.dwSize = sizeof(ProcEntry);
	bIsok = Process32First(pSnap, &ProcEntry);	

	while(bIsok)
	{
		printf("%s  %un\n", ProcEntry.szExeFile, ProcEntry.th32ProcessID);
		bIsok = Process32Next(pSnap, &ProcEntry);
	}
	CloseHandle(pSnap);
	return 1;
}      

int EnumerateHeaps(DWORD PID)
{
	HANDLE pSnapHeaps = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, PID);
	bool bIsok = false;
	bool bIsokHeap = false;
	__int64 size = 0;
	HEAPLIST32 HpLst;
	HEAPENTRY32 HpEntry;
	HpLst.dwSize = sizeof(HEAPLIST32);
	HpEntry.dwSize = sizeof(HEAPENTRY32);
	bIsok = Heap32ListFirst(pSnapHeaps, &HpLst);
	while (bIsok)
	{
		bIsokHeap = Heap32First(&HpEntry, PID, HpLst.th32HeapID);
		while(bIsokHeap)
		{
			//printf("%u %u	\n", HpEntry.dwAddress, HpEntry.dwBlockSize);
			size += HpEntry.dwBlockSize;
			bIsokHeap = Heap32Next(&HpEntry);
		}
		bIsok = Heap32ListNext(pSnapHeaps, &HpLst);
	}
	printf("size: %lf mb", size/1024.0/1024.0);
	CloseHandle(pSnapHeaps);
	return 1;
}

int main()
{
    EnumerateProcs();
    int i;
    scanf("%i",&i);
    EnumerateHeaps(i);
    getch();
    return 0;   
}
После того как все процессы выведутся с указанными id, просто выберите вас интересующий и введите id и программа переберет все имеющиеся кучи и посчитает занимаемую память =)
Kostia вне форума Ответить с цитированием
Старый 29.09.2010, 14:01   #5
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Kostia, спасибо! Судя по характерным скобкам и количеству подключеных модулей это какая-то разновидность языка си? Скажи пожалуста как язык правильно называется, и вообще куда это вставить (Console application, application и тд)? Просто я в своей жизни С видел два раза краем уха, понятия не имею, как там что. Сам пишу на паскале.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 29.09.2010, 15:30   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ну, вовсе не обязательно лезть отладчиком в такие дебри, тем более на низком уровне всё-равно ничего конкретного не увидишь сквозь кучу обращений к менеджеру памяти. Есть штатные средства вроде Get/SetMemoryManager, можно натыкать своих функций-переходников, которые будут отчитываться за каждый выделенный байт.
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отследить событие Mikkelle Microsoft Office Word 0 11.05.2010 15:05
Куда отследить куда утекает память? TwiX Общие вопросы Delphi 6 02.03.2010 03:10
Как отследить нажатие кнопки? Bezdar Microsoft Office Excel 9 17.12.2008 11:12
Как отследить направление движения мыши? yourself Общие вопросы Delphi 8 30.05.2008 08:04
Как отследить отпускание клавиши? Zefick Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 27.05.2008 19:14