Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Структура виртуального адресного пространства процесса  (Прочитано 16620 раз)
0 Пользователей и 1 Гость смотрят эту тему.
diamido
Гость
« : 27-08-2008 05:09 » 

Доброго времени суток.

- Мне необходимо вывести структуру виртуального адрессного пространства процесса (занятые и свободные области, их тип, состояние)

Может я чегото не понимаю но лазил по сайтам и так и не смог понять как это сделать, предпочтение отдаёться графическому виду, но и таблицный пойдёт а я уже смогу сделать как мне надо. Помогите напишите что это такое и как это реализовать.

(Мне необходимо вывести количество куч, количество блоков в кучах, объём памяти во всех кучах и в каждой отдельно.)


Заранее всем откликнувшимся очень благодарен.
« Последнее редактирование: 27-08-2008 05:16 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 27-08-2008 05:17 » 

diamido, не надо одно и то же повторять в двух темах
Записан

diamido
Гость
« Ответ #2 : 27-08-2008 05:18 » 

просто хоте разделить ответы что бы потом проще было отслеживать. Хоршо больше не буду
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 27-08-2008 06:05 » 

diamido, понятие куча и виртуальное адресное пространство процесса не пересекаются технологически. Из всей технологии виртуальной памяти, менеджер куч зависит только от вызова запроса выделения памяти. Получить хэндлы куч процесса можно вызовом GetProcessHeaps...

Я отвечал на вопрос: "Мне необходимо вывести количество куч, количество блоков в кучах, объём памяти во всех кучах и в каждой отдельно" в теме "Структура виртуального адресного пространства процесса"  С ума сойти...
« Последнее редактирование: 27-08-2008 06:09 от sss » Записан

while (8==8)
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #4 : 27-08-2008 06:38 » 

эээ, могу ошибаться, но пока ты в куче ничего не разместил, говорить о ее структуре не имеет смысла.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
sss
Специалист

ru
Offline Offline

« Ответ #5 : 27-08-2008 07:51 » 

Наверное у человека путаница с понятиями куча и блоки виртуальной памяти процесса. Все заморочки по работе с функциями  VirtualXXXX на себя берет группа функций HeapXXX. С функциями VirtualXXXX есть смысл работать при обмене с дровами или другими процессами...
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 27-08-2008 08:26 » 

может я всё же неправильно в одну тему свалил две темы, но мне показалось, что об одном и том же был вопрос (по крайней мере часть поста была одинаковая) Улыбаюсь
Так что просьба к автору: расскажи цель, что хочешь добиться, и тебе подскажут , куда копать
Записан

diamido
Гость
« Ответ #7 : 27-08-2008 12:00 » 

Я сделал два поста один по кучам воторой по рабочему набору процесса.

По кучам я нашёл решение. По ProcessID  я выбираю всю инфу по кучах и помещаю её в ListView.
Вот код если кому интересно:

Код:
int TMainFrm::EnumerateHeaps(DWORD PID)
 {
  TListItem * n;
  String t="";
  int count = 0; // количество блоков
  int Summ = 0;  // сумарный объём.
  int HCount = 0; // Количество куч.
  int SubSum = 0; // размер кучи
  LVH->Clear();
  //Первый параметр - идентификатор процесса
  //а второй - основная куча
  //Теперь делаем снимок, чтоб перечислить кучки...
  HANDLE pSnapHeaps = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, PID);
  bool bIsok = false;
  bool bIsokHeap = false;
  //Структура, в которую будут записываться данные списка кучи
  HEAPLIST32 HpLst;
  //Структура, в которую будут записываться данные
  //непосредствнно БЛОКОВ КУЧИ
  HEAPENTRY32 HpEntry;
  //Ставим размеры...
  HpLst.dwSize = sizeof(HEAPLIST32);
  HpEntry.dwSize = sizeof(HEAPENTRY32);
  bIsok = Heap32ListFirst(pSnapHeaps, &HpLst);
  while (bIsok)
   {
    count = 0;
    SubSum = 0;
    //выводим инфу о куче в общем
    n = LVH->Items->Add();
    n->Caption = HpLst.th32HeapID;

    //Теперь перечисляем блоки кучи
    //этот код я привел, чтобы стало ясно
    //как получить данные по блокам
    //но он жрет много времени
    //так что я его закомментирую - если вам интересно
    //можете погонять...
    bIsokHeap = Heap32First(&HpEntry, PID, HpLst.th32HeapID);
      while(bIsokHeap)
        {
  //считаем количество
  count++;
          SubSum += HpEntry.dwBlockSize;
  //Шагаем дальше
  bIsokHeap = Heap32Next(&HpEntry);
      }
     n->SubItems->Add(count);
     //printf("%u n", HpLst.dwSize);
     t = SubSum/1024;
     t += " КБ";
     Summ += SubSum;
     n->SubItems->Add(t);
     HCount++;
     //шагаем дальше
     bIsok = Heap32ListNext(pSnapHeaps, &HpLst);
    }
    t = Summ/1024;
    t += " КБ";
    LBSum->Caption = t;
    LHCount->Caption = HCount;
   CloseHandle(pSnapHeaps);
   return 1;
}

Вторым вопросом мне надо было найти: "размер минимального,максимального и текущего рабочего набора процесса"

Этот вопрос я ещё не решил.. Нашёл функции: GetProcessWorkingSetSize,GetProcessMemoryInfo (посоветовали)
Но пока не нашёл как это провернуть, вернее не начал если у кого то есть соображения то можете поделиться.
Записан
diamido
Гость
« Ответ #8 : 27-08-2008 12:00 » 

Просто потом модератор слил два поста в один.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 27-08-2008 12:01 » new

да, наверное поторопился я, если неправ - извиняюсь
Записан

sss
Специалист

ru
Offline Offline

« Ответ #10 : 28-08-2008 02:37 » 

diamido, попробуй копнуть GlobalMemoryStatus.  Хотя для получения размера минимального максимального набора процесса хватает GetProcessWorkingSetSize. А вот с текущим поможет GlobalMemoryStatus.

Лично мне всегда не нравилось использование CreateToolhelp32Snapshot для получения списков куч. Там скорее VMM MDL чем кучи. Есть функция HeapWalk, которая описывает кучу процесса.  Вот раньше не знал, а теперь забыл, по умолчанию, какую API вызывает стандартный alloc Не понял
« Последнее редактирование: 28-08-2008 03:03 от sss » Записан

while (8==8)
diamido
Гость
« Ответ #11 : 28-08-2008 06:17 » 

Цитата
Функция GlobalMemoryStatus позволяет получить информацию про текущее использование системой как физической, так и виртуальной памяти.

мне надо получить инфу по любому процессу системы, тоесть я могу вытянуть handle или ProcessID и по нему надо узнать текущий набор...

Максимальный и минимальный я получил.

Я нашёл код для получения инфы о процессе (рабочем наборе)

 // текущий набор
 PROCESS_MEMORY_COUNTERS pmc;
 ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS));
 pmc.cb = sizeof(PROCESS_MEMORY_COUNTERS);
  if (GetProcessMemoryInfo(HProc,&pmc,sizeof(pmc)))
   {
       //SIZE_T szSizeInBytes = pmc.WorkingSetSize;
       LCurR->Caption = pmc.WorkingSetSize;
   }

Пдключил в начале фалу библиотеку : #include <psapi.h>

Но при компиляции выдаёт ошибку: Unresolved external 'GetProcessMemoryInfo' referenced from <путь к вайлу obj главной формы>

И так было со всем и вункциями psapi.dll

В чём может быть косяк? 
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 28-08-2008 07:34 » 

В опциях линковки проекта psapi.lib добавлена в "Input/Additional Dependencies"?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines