Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
fladik
0 / 0 / 0
Регистрация: 19.01.2009
Сообщений: 5
#1

Инспектор динамической памяти процессов - C++

19.01.2009, 13:18. Просмотров 1268. Ответов 3
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста. Нужно сделать "Инспектор динамической памяти процессов". Может у кого-нибудь есть что-нибудь?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2009, 13:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инспектор динамической памяти процессов (C++):

Очередь в динамической памяти - C++ Builder
Привет всем, реализую очередь с помощью двух связного списка, можно добавить, удалить и просмотреть элементы, уже всю программу написал...

Выделение динамической памяти - C++ Builder
Задан граф в виде матрицы смежности вершин. Найти число компонент связности в этом графе. Программа сделанная,но надо выделить...

Ошибка очистки динамической памяти - C++ Builder
Добрый день! Пожалуйста подскажите? что я делаю не так? Записываю небольшой текст в RichEdit, считываю его в динамический массив,...

Ошибка динамической памяти при компиляции - C++ Builder
При нажатии баттона не компилирует по памяти, в чем может быть ошибка? Во вложение картинка ошибки. #include <vcl.h> #pragma...

Как добавить свой класс в инспектор объектов? - C++ Builder
Создал объект, уноследовав его. Как сделать так, чтобы его поля и методы были видны в инеспекторе объектов?

Структуры в динамической памяти. - Visual C++
Описать структуру с именем Marsh, содержащую следующие поля: * название начального пункта маршрута * название конечного пункта маршрута...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
YurA_280784
Заблокирован
23.01.2009, 10:14 #2
Лови мой ProcsViewer(копия taskmgr, максимальное использование памяти процессом эт Working Set Peak, а текущее использование памяти Working Set. Если Working Set Peak постоянно возрастает, значит процесс жрёт память, кстати я так и увидел что сам ProcsViewer по началу жрал, пришлось повозиться с отчисткой динамически выделяемой памяти для PPERF_DATA_BLOCK. Кстати прога берёт все данные из HKEY_PERFORMANCE_DATA - т.е виртуальной части реестра.

Вобщем кидаю тебе мой класс СProcMgr.h, сам экзешник и прототип
void CProcsViewerDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int i,j,nCount;
void *lpBuf;
char * sParam;
if(IsTimer)
{
if(tick%10 == 0){
lpBuf = lpm->GetProcessInformation(100);
for(i = 0; i < lpm->dwNumInst; i++)
{
for(j = 0; j <= lpm->nParam; j++)
{
sParam = lpm->GetOutputData(lpm->pRETDATA,j,i);
EditListItem(m_list1,sParam,i,j);
free(sParam);
}
}
nCount = m_list1.GetItemCount();
for(i; i < nCount; i++)
m_list1.DeleteItem(i);
for(j = 0; j < lpm->nParam; j++)
free((void *)lpm->pRETDATA[j]);
free(lpBuf);//Обязательно освобождать память!!!
}
}
else
KillTimer(nIDEvent);
tick++;
if(100 < tick)
tick = 0;
CDialog::OnTimer(nIDEvent);
}
(Ну как я юзаю мой класик в проге)

//Данное написать в самом начале Dlg.cpp ну или где ты там буш подключать CProcMgr.h
LPPROCMGR lpm = new CProcMgr();
bool IsTimer = false;
int tick = 0;
Усё програмировал сам!!!

Если буд вопросы по проге пиши.
Надеюсь пригодиться...

Добавлено через 1 минуту 27 секунд
Чьёрт, чёта прикрепления не отправились
Короче вот код CProcMgr.h

#ifndef CPROCMGR_H
#define CPROCMGR_H

#include <windows.h>
#include <winperf.h>
#include <stdio.h>

typedef struct tagPERFDATA
{
char *chIndex;
char *sObject;
} PERFDATA;

struct
{
UINT index;
LPTSTR name;
}
szParam [] =
{
// { 1, "Executable" },
{ 1, "ID Process" },
/* { 1, "Executable" },
// { 1024, "Virtual Bytes" },
// { 1024, "Virtual Bytes Peak" },*/
{ 1024, "Working Set" },
{ 1024, "Working Set Peak" },
{ 1, "Number of active flows" },
{ 1, "% Processor Time" },
{ 0, NULL },
};

class CProcMgr
{
public :
PERFDATA * pCOUNTER;

LPCSTR sRegPath;
LPCSTR sParam;

LPTSTR szIndex;
DWORD * dwIndex;
char ** chTITLE;
UINT nParam;
UINT * uDivider;

DWORD dwBytes;
DWORD dwNumInst;
DWORD SleepTime;
DWORD * pCPU;
DWORD Y0;
DWORD Y1;

PERFDATA ** pRETDATA;

CProcMgr();
// ~CProgMgr();
PERFDATA * ReadPerflibData(LPCSTR sRegPath, LPCSTR sParam);
LPTSTR GetPerflibDataIndex(PERFDATA * pPERFDATA, LPCSTR sObject);
LPVOID GetPerflibDataBlock(LPTSTR szIndex, DWORD &dwBytes);
PERFDATA * GetPerfInstDef(PERFDATA * pPERFDATA, LPVOID lpBuf, DWORD dwParam);
LPVOID GetProcessInformation(DWORD SleepTime);
LPTSTR GetOutputData(PERFDATA ** pRETDATA, int iParam, int iInst);
};
typedef CProcMgr *LPPROCMGR;

CProcMgr::CProcMgr()
{

sRegPath = (LPCSTR)"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\009";
sParam = (LPCSTR)"Counter";
pCOUNTER = ReadPerflibData(sRegPath, sParam);
if(0 < atoi(pCOUNTER[0].chIndex))
{
szIndex = GetPerflibDataIndex(pCOUNTER,"Process");
dwBytes = 1024*sizeof(PPERF_DATA_BLOCK);
void * lpBuf = GetPerflibDataBlock(szIndex, dwBytes);
PPERF_DATA_BLOCK pdb = (PPERF_DATA_BLOCK)lpBuf;
dwNumInst = ((PPERF_OBJECT_TYPE)((PBYTE)pdb + pdb->HeaderLength))->NumInstances - 1;
pCPU = (DWORD *)malloc(dwNumInst*sizeof(DWORD));
free(lpBuf);

nParam = 0;
dwIndex = (DWORD *)malloc(sizeof(DWORD)*(nParam + 1));
while(0 < szParam[nParam].index)
{
dwIndex[nParam] = atoi(GetPerflibDataIndex(pCOUNTER,szParam[nParam].name));
dwIndex = (DWORD *)realloc((void *)dwIndex,sizeof(DWORD)*(nParam + 2));
nParam++;
}
chTITLE = new char * [nParam + 1];
uDivider = (UINT *)malloc(nParam);
chTITLE[0] = (char *)"sMODULE";

for(int i = 0; i < nParam; i++)
{
uDivider[i] = szParam[i].index;
chTITLE[i + 1] = (char *)malloc(strlen(szParam[i].name) + 1);
sprintf(chTITLE[i + 1],"%s",szParam[i].name);
//strcpy(chTITLE[i],szParam[i].name);
}
SleepTime = 100;
pRETDATA = new PERFDATA * [nParam + 1];
// GetProcessInformation(SleepTime);
}
}

PERFDATA * CProcMgr::ReadPerflibData(LPCSTR sRegPath, LPCSTR sParam)
{
int nCount = 0;
HKEY hKey ;
DWORD dwBytes;
PERFDATA * pPERFDATA = (PERFDATA *)
malloc(sizeof(PERFDATA)*(nCount + 1));
// Открываем ключ.
LONG lRes = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
sRegPath,
0,
KEY_READ,
&hKey );
if(lRes == ERROR_SUCCESS)
{
// Получаем размер счётчика.
lRes = RegQueryValueEx( hKey,
sParam,
NULL, NULL, NULL,
&dwBytes );
if(lRes == ERROR_SUCCESS)
{
// Распределяем память для буфера.
char * chBuf = (char *) malloc( dwBytes );
pPERFDATA[nCount].chIndex = (char *)malloc(MAX_PATH);
pPERFDATA[nCount].sObject = (char *)malloc(MAX_PATH);
// Получаем заголовки и счётчики.
lRes = RegQueryValueEx( hKey,
sParam,
NULL, NULL,
(LPBYTE)chBuf,
&dwBytes );
if(lRes == ERROR_SUCCESS)
{
nCount++;
pPERFDATA = (PERFDATA *)
realloc((void *)pPERFDATA,sizeof(PERFDATA)*(nCount + 1));
while(*chBuf)
{
pPERFDATA[nCount].chIndex = (char *)malloc(strlen(chBuf) + 1);
strcpy(pPERFDATA[nCount].chIndex,chBuf);
chBuf = &(*(chBuf + strlen(chBuf) + 1));
pPERFDATA[nCount].sObject = (char *)malloc(strlen(chBuf) + 1);
strcpy(pPERFDATA[nCount].sObject,chBuf);
chBuf = &(*(chBuf + strlen(chBuf) + 1));
nCount++;
pPERFDATA = (PERFDATA *)
realloc((void *)pPERFDATA,sizeof(PERFDATA)*(nCount + 1));
}

sprintf(pPERFDATA[0].chIndex,"%d",nCount);
sprintf(pPERFDATA[0].sObject,"%d",dwBytes);
// Закрываем ключ.
RegCloseKey( hKey );
}
}
}
return pPERFDATA;
}

LPTSTR CProcMgr::GetPerflibDataIndex(PERFDATA * pPERFDATA, LPCSTR sObject)
{
int ObjLen = strlen(sObject);
int nCount = atoi(pPERFDATA[0].chIndex);
char *chBuf;
for(int i = 1; i < nCount; i++)
{
if(strlen(pPERFDATA[i].sObject) == ObjLen)
if(strstr(sObject,pPERFDATA[i].sObject))
{
chBuf = pPERFDATA[i].chIndex;
break;
}
}
return chBuf;
}

LPVOID CProcMgr::GetPerflibDataBlock(LPTSTR szIndex, DWORD &dwBytes)
{
void * lpBuf = malloc(dwBytes);
while( RegQueryValueEx(HKEY_PERFORMANCE_DATA,
(LPTSTR)szIndex,
NULL,NULL,
(LPBYTE)lpBuf, &dwBytes) == ERROR_MORE_DATA )
{
dwBytes += 1024*sizeof(PPERF_DATA_BLOCK);
// Распределённая память мала;
//перераспределяем новую память.
lpBuf = realloc(lpBuf,dwBytes);
}
lpBuf = realloc(lpBuf,dwBytes);
return lpBuf;
}

PERFDATA * CProcMgr::GetPerfInstDef(PERFDATA * pPERFDATA, LPVOID lpBuf, DWORD dwParam)
{
PPERF_DATA_BLOCK pdb = (PPERF_DATA_BLOCK)lpBuf;
// Получаем PERF_OBJECT_TYPE.
PPERF_OBJECT_TYPE pot = (PPERF_OBJECT_TYPE)
((PBYTE)pdb + pdb->HeaderLength);
// Получаем объявление первого счётчика.
PPERF_COUNTER_DEFINITION pcd = (PPERF_COUNTER_DEFINITION)
((PBYTE)pot + pot->HeaderLength);
// Получаем значение индекса для dwParam
for(int i = 0; i < (int)pot->NumCounters; i++ )
{
if (pcd->CounterNameTitleIndex == dwParam)
{
dwParam = pcd->CounterOffset;
break;
}
pcd = ((PPERF_COUNTER_DEFINITION)((PBYTE)pcd + pcd->ByteLength));
}
// Получаем первый экземпляр объекта.
PPERF_INSTANCE_DEFINITION pid = (PPERF_INSTANCE_DEFINITION)
((PBYTE)pot + pot->DefinitionLength);
// Получаем имя первого процесса.
PPERF_COUNTER_BLOCK pcb = (PPERF_COUNTER_BLOCK)
((PBYTE)pid + pid->ByteLength );

pPERFDATA = (PERFDATA *)
malloc(sizeof(PERFDATA)*(pot->NumInstances - 1));

for(i = 0; i < pot->NumInstances - 1; i++ )
{
pPERFDATA[i].chIndex = (char *)((DWORD *)((PBYTE)pcb + dwParam));
pPERFDATA[i].sObject = (char *)((PBYTE)pid + pid->NameOffset);

pid = (PPERF_INSTANCE_DEFINITION)
((PBYTE)pcb + pcb->ByteLength);
pcb = (PPERF_COUNTER_BLOCK)
((PBYTE)pid + pid->ByteLength);
}
return pPERFDATA;
}

LPVOID CProcMgr::GetProcessInformation(DWORD SleepTime)
{
void * lpBuf = GetPerflibDataBlock(szIndex, dwBytes);
PPERF_DATA_BLOCK pdb = (PPERF_DATA_BLOCK)lpBuf;
dwNumInst = ((PPERF_OBJECT_TYPE)((PBYTE)pdb + pdb->HeaderLength))->NumInstances - 1;
pRETDATA[nParam] = GetPerfInstDef(pRETDATA[nParam], lpBuf, dwIndex[nParam - 1]);
pCPU = (DWORD *)realloc((void *)pCPU,dwNumInst*sizeof(DWORD));
for(int i = 0; i < dwNumInst; i++)
pCPU[i] = ((DWORD *)pRETDATA[nParam][i].chIndex)[0];
Y0 = pdb->PerfTime100nSec.QuadPart;
free((void *)pRETDATA[nParam]);
free(lpBuf);
Sleep(SleepTime);

lpBuf = GetPerflibDataBlock(szIndex, dwBytes);
pdb = (PPERF_DATA_BLOCK)lpBuf;
Y1 = ((PPERF_OBJECT_TYPE)((PBYTE)pdb + pdb->HeaderLength))->NumInstances - 1;
if(Y1 < dwNumInst)
dwNumInst = Y1;

Y1 = pdb->PerfTime100nSec.QuadPart;
for(int j = 0; j < nParam; j++)
pRETDATA[j] = GetPerfInstDef(pRETDATA[j], lpBuf, dwIndex[j]);
return lpBuf;
}

LPTSTR CProcMgr::GetOutputData(PERFDATA ** pRETDATA, int iParam, int iInst)
{
iParam--;
char *sParam = (char *)malloc(MAX_PATH);
if(iParam < 0)
sprintf(sParam,"%ls",pRETDATA[0][iInst].sObject);
else
{
DWORD dwParam = ((DWORD *)pRETDATA[iParam][iInst].chIndex)[0];
if(iParam == nParam - 1)
{
uDivider[iParam] = Y1 - Y0;
dwParam = dwParam - pCPU[iInst];
dwParam *= 100;
}
sprintf(sParam,"%d",dwParam/uDivider[iParam]);
}
return sParam;
}

#endif
1
YurA_280784
Заблокирован
23.01.2009, 10:18 #3
Пробую ещё разок прикрепить файлы, м-да туговато тут как-то их приклеить
0
Вложения
Тип файла: rar ProcsViewer_exe.rar (8.3 Кб, 28 просмотров)
Тип файла: rar CProcMgr.h.rar (2.1 Кб, 37 просмотров)
fladik
0 / 0 / 0
Регистрация: 19.01.2009
Сообщений: 5
23.01.2009, 14:42  [ТС] #4
Спасибо большое.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2009, 14:42
Привет! Вот еще темы с ответами:

Ошибка с выделением динамической памяти - Visual C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class Vector { private: int *mas; int buf; int...

Матрица и выделение динамической памяти под нее - Visual C++
Всем привет. Условие программы такое: По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующей...

Разработать консольное Windows-приложение для просмотра активных процессов в памяти. - Visual C++
пожалуйста помогите кто может, у меня есть наброски но это под Linux, а мне надо под Windows, заранее благодарен

В Maicrosoft Visual C++ пропало окно объект инспектор - Visual C++
В Maicrosoft Visual C++ пропало окно объект инспектор. Подскажите как его востанавить.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.01.2009, 14:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru