Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > объем памяти занимаемый программой


Автор: Step 9.6.2004, 14:10
требуеться что бы прога выводила объем оперативной памяти которую занимает....

как ее определить...

Автор: shedon 9.6.2004, 14:55
Можно что-то подобное изобразить:
Код

#include <windows.h>
#include <stdio.h>
#include "psapi.h"

void PrintMemoryInfo( )
{
  DWORD processID = GetCurrentProcessId();
   HANDLE hProcess;
   PROCESS_MEMORY_COUNTERS pmc;

   // Print the process identifier.

   printf( "\nProcess ID: %u\n", processID );

   // Print information about the memory usage of the process.

   hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );
   if (NULL == hProcess)
       return;

   if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
   {
       printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
       printf( "\tPeakWorkingSetSize: 0x%08X\n",
                 pmc.PeakWorkingSetSize );
       printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
       printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n",
                 pmc.QuotaPeakPagedPoolUsage );
       printf( "\tQuotaPagedPoolUsage: 0x%08X\n",
                 pmc.QuotaPagedPoolUsage );
       printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n",
                 pmc.QuotaPeakNonPagedPoolUsage );
       printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n",
                 pmc.QuotaNonPagedPoolUsage );
       printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage );
       printf( "\tPeakPagefileUsage: 0x%08X\n",
                 pmc.PeakPagefileUsage );
   }

   CloseHandle( hProcess );
}

Автор: Step 9.6.2004, 14:58
shedon , спасибо попробую сейчас

Автор: AndyY 9.6.2004, 19:50
Скорее интересно не сколько всего памяти размещено, а кто, какими путями и зачем распределил сколько памяти. Еще интересней узнать это без дополнительных программ и удаленно (у программера на компе обычно все и так работает, а у юзера фиг знает где, да еще и бестолкового - скушало 200 мб за 2 дня и не воспроизводится).

решение есть, лежит в области установки хуков и трассировки стеков. Может как-нибудь статью напишу про это. Отправная точка - нужно отслеживать все вызовы VirtualAlloc и VirtualFree и складывать в мап с ключем - стек вызова.

Автор: mr.DUDA 9.6.2004, 20:45
Цитата
Отправная точка - нужно отслеживать все вызовы VirtualAlloc и VirtualFree и складывать в мап с ключем - стек вызова.

Не совсем ясно, как тогда отслеживать выделение памяти по new/delete, работающие с "кучей" (или по malloc/free). Тем более, что VirtuallAlloc неэффективен с той стороны, что выделяет блоки памяти с размером, кратным размеру страницы памяти (4 Кб).

Автор: AndyY 9.6.2004, 21:09
mr.DUDA
Вы абсолютно правы, допустил неточность.
Перхватывать нужно HeapAlloc/HeapFree.
new реализован через malloc, malloc реализован через HeapAlloc. итд.
отслеживать естественно стек вызовов

Автор: Step 10.6.2004, 10:13
НЕ товарищи вы меня не збивайте
у меня прога выделяет динамически такие объемы памяти что я и счетать не берусь
начина от 3 мерных массиво и кончаю уймой объектов
вот я нехочу считать а хочу после выделения просто узнать.....

Автор: shedon 10.6.2004, 10:26
Цитата
вот я нехочу считать а хочу после выделения просто узнать.....

Ну вот код который я привёл выше это и делает.

Автор: Step 10.6.2004, 10:30
shedon , тебе большая блогодарность
но я еще не нашел место в программе в котором у меня макс памяти, а делать слежение впадло

Автор: mr.DUDA 10.6.2004, 21:05
тогда проверяй периодически

Автор: Step 11.6.2004, 08:00
mr.DUDA,
у меня задача на графы, размерность бешенные у меня один граф просчитываеться 16 мин, и это время меняеться даже если я лишнюю операцию вставлю, ты представь как оно увеличиться если я переодически проверять буду......
мне нужно найти место где объем памяти максимальный и там взять значения, но при использовании рекурсии это трудновато сделать...

Автор: mr.DUDA 11.6.2004, 08:45
Самый простой способ - это "завернуть" операции выделения и освобождения памяти в свои функции, которые будут увеличивать и уменьшать счётчик, и при каком-то макс. значении что-то делать (хотя как высчитать это макс. значение, а вдруг потом оно ещё раз увеличится wow.gif).

Автор: Step 11.6.2004, 08:48
mr.DUDA , гемора много... блин профайл не работает почемуто...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)