Профайлер для WIN32 приложений

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Профайлер для WIN32 приложений

Сообщение jangle » 10.08.2011 (Ср) 16:47

Внезапно понадобилась вот такая тулза. Даже не знаю, что лучше писать самому или поискать в сети.
Задача - необходимо запускать несколько консольных приложений и фиксировать в текстовом файле сколько миллисекунд отработает каждое.
Пока нужно измерять только время работы, хотя возможно впоследствии понадобятся еще фичи. Может кто подскажет такую программку, или есть самописная тулза?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Профайлер для WIN32 приложений

Сообщение Хакер » 10.08.2011 (Ср) 17:06

Так это совсем не профайлер.

jangle писал(а):или есть самописная тулза?

Пойдёт:
Код: Выделить всё
#include "stdafx.h"
#include <windows.h>
#include <psapi.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
   STARTUPINFOA si;
   PROCESS_INFORMATION pi;
   
   UINT l_mem = 0;
   UINT l_time = 0;
   
   memset(&si, 0, sizeof si);

   l_mem =  GetPrivateProfileInt(TEXT("Limits"), TEXT("Memory"), 7, TEXT(".\\options.ini"));
   l_time = GetPrivateProfileInt(TEXT("Limits"), TEXT("Time"),   8, TEXT(".\\options.ini"));

   if(!CreateProcessA(NULL, argv[1], NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
   {
      return 101;   
   }

   
   if(WAIT_OBJECT_0 != WaitForSingleObject(pi.hProcess, INFINITE))
   {
      return 102;
   }

   if(l_mem > 0)
   {
      PROCESS_MEMORY_COUNTERS memcnt;
      memset(&memcnt, 0, sizeof memcnt);
      memcnt.cb = sizeof memcnt;
       
      if(GetProcessMemoryInfo(pi.hProcess, &memcnt, sizeof memcnt))
      {
         if(memcnt.PeakPagefileUsage > l_mem)
         {
            return 11;
         }
      }
      else
      {
         CloseHandle(pi.hProcess);
         return 103;
      }      
   }

   if(l_time > 0)
   {
      FILETIME tm_start, tm_end, tm_km, tm_um;
      GetProcessTimes(pi.hProcess, &tm_start, &tm_end, &tm_km, &tm_um);

      ULONGLONG t_start, t_end, t_delta;
      memcpy(&t_start, &tm_start, sizeof t_start);
      memcpy(&t_end, &tm_end, sizeof t_end);
      t_delta = t_end - t_end;
      
      t_delta = t_delta / 10000;
      if(t_delta > l_time)
      {
         printf("dbg: time failure");
         return 12;
      }
   }

   DWORD dw_ecode;
   GetExitCodeProcess(pi.hProcess, &dw_ecode);
   if(dw_ecode != 0) return 15;
   
   return 0;
}

Контролирует время и пиковое использование памяти.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Профайлер для WIN32 приложений

Сообщение jangle » 10.08.2011 (Ср) 17:19

Хакер писал(а):Так это совсем не профайлер.

Контролирует время и пиковое использование памяти.


Спасибо. Но у меня почему-то не компилится

Код: Выделить всё
Ошибка   1   error LNK2019: ссылка на неразрешенный внешний символ _GetProcessMemoryInfo@12 в функции _main   

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Профайлер для WIN32 приложений

Сообщение Admiralisimys » 10.08.2011 (Ср) 17:37

jangle добавь на прилинковку Psapi.lib в свойствах проекта или допиши в начале исходника #pragma comment(lib, "Psapi.lib")

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Профайлер для WIN32 приложений

Сообщение jangle » 10.08.2011 (Ср) 20:41

Admiralisimys писал(а):jangle добавь на прилинковку Psapi.lib в свойствах проекта или допиши в начале исходника #pragma comment(lib, "Psapi.lib")


Собралось, но программа все равно валится при старте

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Профайлер для WIN32 приложений

Сообщение Admiralisimys » 10.08.2011 (Ср) 21:09

jangle с каким сообщением/на какой строчке (если запускать со студии кнопкой F5)?
По замыслу Хакерif(!CreateProcessA(NULL, argv[1], NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) требуемое на отловку приложение должно быть передана через командную строку в первом параметре. Это было выполнено? Прога не проверяет отсутствие параметра.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Профайлер для WIN32 приложений

Сообщение Хакер » 10.08.2011 (Ср) 21:49

Блин, я даже не думал, что тебе придёт в голову это компилировать. Это просто исходничек, который демонстирует, чем измерять.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Профайлер для WIN32 приложений

Сообщение jangle » 11.08.2011 (Чт) 12:39

Хакер писал(а):Блин, я даже не думал, что тебе придёт в голову это компилировать. Это просто исходничек, который демонстирует, чем измерять.


Ну так я знаю чем измерять, просто лень отвлекаться и писать самому такую тулзу.

yukdima
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 25.08.2011 (Чт) 16:05
Откуда: Россия

Re: Профайлер для WIN32 приложений

Сообщение yukdima » 26.08.2011 (Пт) 9:59

анологично программа валится при старте,помогите решить проблему
[Хакер] :: Подпись с рекламной ссылкой вырезана.


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList