Как обнаруживаются утечки памяти? В многопоточных приложениях

Тема в разделе "WASM.BEGINNERS", создана пользователем UTeX, 4 дек 2007.

  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Есть приложение в котором около 500 потоков
    Как отследить утечки памяти
    То тут то там обращение к вроде бы как освобожденной области памяти
    Помогите
     
  2. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    valgrind (Mixed options[], Pointer-To-your-program)
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    device
    Его можно завести под Windows?
    Бунчекер
     
  4. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    BoundsChecker есть для обычных прог и для дров, утечки не уйдут!
     
  5. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    мы юзаем gflags
    течки - это полный П, хуже только случайные падения без дампа :dntknw:
     
  6. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    С дровами как раз многократно проще
    Таги только надо один раз не полениться и завести на каждый тип операции
     
  7. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    http://slil.ru/25188805

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

    MSVC++ 8

    так работает

    Код (Text):
    1. int main(int argc, char **argv, char *envp)
    2. {
    3.     CUnicodeStringStorage ProcessesList;
    4.     CUnicodeStringStorage MD5Hashes;
    5.     PMD5_THREAD_DATA MD5StChain;
    6.     HANDLE *hMD5Threads;
    7.     HCRYPTPROV Provider;
    8.     WCHAR *ProviderName = L"_MD5KeyContainer";
    9.     SIZE_T fullsize = 0;
    10.  
    11.     //enable SeDebugPrivilege to allow attaching SYSTEM processes
    12.     AddDebugPrivilege();
    13.  
    14.     //getting all modules names list
    15.     GetModulesListViaToolHelp(&ProcessesList);// visible list
    16.     GetModulesListViaQueryWrapper(&ProcessesList);//trying to include undetectable with simple walk
    17.     //excluding all repeatable modules names from list
    18.     ProcessesList.ExcludeAlreadyExists();
    19.  
    20.     //write all loaded modules names into "nilog.nat"
    21.     FMapObject *MapObj = new FMapObject(L"nilog.nat", CREATE_ALWAYS, (size_t)sizeof(WCHAR)*ProcessesList.CalculateWholeStorages());
    22.     ProcessesList.SaveToLinearStorage((PWCHAR)MapObj->GetDataPointer(), (size_t)MapObj->FileSize());
    23.     delete MapObj;
    24.     //calculating MD5 hashes
    25.     //multithreading here might be helpful
    26.     MD5StChain = (PMD5_THREAD_DATA)new MD5_THREAD_DATA[ProcessesList.GetDim()];
    27.     RtlZeroMemory((PBYTE)MD5StChain, ProcessesList.GetDim() * sizeof MD5_THREAD_DATA);
    28.     hMD5Threads = (HANDLE *)new HANDLE[ProcessesList.GetDim()];
    29.     RtlZeroMemory((PBYTE)hMD5Threads, ProcessesList.GetDim() * sizeof HANDLE);
    30.     SeparateThreadsContext *Context = new SeparateThreadsContext(ProcessesList.GetDim());
    31.     if(!CryptAcquireContext(&Provider, ProviderName, 0, PROV_RSA_FULL, 0))
    32.         CryptAcquireContext(&Provider, ProviderName, 0, PROV_RSA_FULL, CRYPT_NEWKEYSET);
    33.     for(DWORD i = 0; i < ProcessesList.GetDim(); i++)
    34.     {
    35.         MD5StChain[i].File = new FMapObject(ProcessesList[i], OPEN_EXISTING);
    36.         MD5StChain[i].Data = (PBYTE)MD5StChain[i].File->GetDataPointer();
    37.         MD5StChain[i].DataSize = (DWORD)MD5StChain[i].File->FileSize();
    38.         MD5StChain[i].ContainerName = ProviderName;
    39.         MD5StChain[i].CryptoProvider = Provider;
    40.         //Context->CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MD5ThreadProc, &MD5StChain[i], 0);
    41.         MD5ThreadProc(&MD5StChain[i]);  //<<here is a direct call
    42.     }
    43.     //wait for all the threads
    44.     //Context->WaitForObjects(TRUE, INFINITE);
    45.     CryptReleaseContext(Provider, 0);
    46.     delete Context;
    47.     //write all the hashes into the md5.nat
    48.     TranslateDigestsToUnicode(MD5StChain, ProcessesList.GetDim(), &MD5Hashes);
    49.     MapObj = new FMapObject(L"nimd5.log", CREATE_ALWAYS, (size_t)sizeof(WCHAR)*MD5Hashes.CalculateWholeStorages());
    50.     MD5Hashes.SaveToLinearStorage((PWCHAR)MapObj->GetDataPointer(), (size_t)MapObj->FileSize());
    51.     delete MapObj;
    52.     delete MD5StChain;
    53.     return 0;
    54. }
    а при замене на многопоточное выполнение - нет

    Код (Text):
    1. int main(int argc, char **argv, char *envp)
    2. {
    3.     CUnicodeStringStorage ProcessesList;
    4.     CUnicodeStringStorage MD5Hashes;
    5.     PMD5_THREAD_DATA MD5StChain;
    6.     HANDLE *hMD5Threads;
    7.     HCRYPTPROV Provider;
    8.     WCHAR *ProviderName = L"_MD5KeyContainer";
    9.     SIZE_T fullsize = 0;
    10.  
    11.     //enable SeDebugPrivilege to allow attaching SYSTEM processes
    12.     AddDebugPrivilege();
    13.  
    14.     //getting all modules names list
    15.     GetModulesListViaToolHelp(&ProcessesList);// visible list
    16.     GetModulesListViaQueryWrapper(&ProcessesList);//trying to include undetectable with simple walk
    17.     //excluding all repeatable modules names from list
    18.     ProcessesList.ExcludeAlreadyExists();
    19.  
    20.     //write all loaded modules names into "nilog.nat"
    21.     FMapObject *MapObj = new FMapObject(L"nilog.nat", CREATE_ALWAYS, (size_t)sizeof(WCHAR)*ProcessesList.CalculateWholeStorages());
    22.     ProcessesList.SaveToLinearStorage((PWCHAR)MapObj->GetDataPointer(), (size_t)MapObj->FileSize());
    23.     delete MapObj;
    24.     //calculating MD5 hashes
    25.     //multithreading here might be helpful
    26.     MD5StChain = (PMD5_THREAD_DATA)new MD5_THREAD_DATA[ProcessesList.GetDim()];
    27.     RtlZeroMemory((PBYTE)MD5StChain, ProcessesList.GetDim() * sizeof MD5_THREAD_DATA);
    28.     hMD5Threads = (HANDLE *)new HANDLE[ProcessesList.GetDim()];
    29.     RtlZeroMemory((PBYTE)hMD5Threads, ProcessesList.GetDim() * sizeof HANDLE);
    30.     SeparateThreadsContext *Context = new SeparateThreadsContext(ProcessesList.GetDim());
    31.     if(!CryptAcquireContext(&Provider, ProviderName, 0, PROV_RSA_FULL, 0))
    32.         CryptAcquireContext(&Provider, ProviderName, 0, PROV_RSA_FULL, CRYPT_NEWKEYSET);
    33.     for(DWORD i = 0; i < ProcessesList.GetDim(); i++)
    34.     {
    35.         MD5StChain[i].File = new FMapObject(ProcessesList[i], OPEN_EXISTING);
    36.         MD5StChain[i].Data = (PBYTE)MD5StChain[i].File->GetDataPointer();
    37.         MD5StChain[i].DataSize = (DWORD)MD5StChain[i].File->FileSize();
    38.         MD5StChain[i].ContainerName = ProviderName;
    39.         MD5StChain[i].CryptoProvider = Provider;
    40.         Context->CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MD5ThreadProc, &MD5StChain[i], 0);
    41.         //MD5ThreadProc(&MD5StChain[i]);    //<<here is a direct call
    42.     }
    43.     //wait for all the threads
    44.     Context->WaitForObjects(TRUE, INFINITE);
    45.     CryptReleaseContext(Provider, 0);
    46.     delete Context;
    47.     //write all the hashes into the md5.nat
    48.     TranslateDigestsToUnicode(MD5StChain, ProcessesList.GetDim(), &MD5Hashes);
    49.     MapObj = new FMapObject(L"nimd5.log", CREATE_ALWAYS, (size_t)sizeof(WCHAR)*MD5Hashes.CalculateWholeStorages());
    50.     MD5Hashes.SaveToLinearStorage((PWCHAR)MapObj->GetDataPointer(), (size_t)MapObj->FileSize());
    51.     delete MapObj;
    52.     delete MD5StChain;
    53.     return 0;
    54. }
    иногда бывают исключения

    если есть время - посмотрите код - помогите
     
  8. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    0xC0000017: Not Enough Quota

    Такие вот еще ошибки вываливаются

    помогите
     
  9. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Весь этот изврат из-за WaitForMultipleObjects пришлось писать
    мож в нем бока?
    но тестил вроде

    посмотрите плиз кто-нибудь
     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    хоть кто-нибудь смотрел? отпишитесь пожалуйста
    есть какие-нибудь мнения?
     
  11. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    неужели там такая тупая ошибка, что все морозятся
     
  12. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    UTeX
    А зачем это делать многопоточно?
     
  13. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    nester7
    потому как файлов около 500 обычно - и так быстрее явно работает
    и затем что ведь код уже написан ''((
     
  14. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Есть предположение что корень бед - флаг HEAP_NO_SERIALIZE при операциях с памятью, скорее всего хип банально портится.
     
  15. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    roman_pro
    убрал флаг - увы не помогло
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    UTeX
    Меня смущает алгоритм ожидания завершения потоков SeparateThreadsContext::WaitForInfiniteObjects. В частности тот факт, что ты пытаешься "обхитрить" MAXIMUM_WAIT_OBJECTS.

    Из описания WaitForMultipleObjects: "To wait on more than MAXIMUM_WAIT_OBJECTS handles, use one of the following methods:
    Create a thread to wait on MAXIMUM_WAIT_OBJECTS handles, then wait on that thread plus the other handles. Use this technique to break the handles into groups of MAXIMUM_WAIT_OBJECTS.
    ". Я понимаю так, что ожидать надо порциями MAXIMUM_WAIT_OBJECTS по в том же самом потоке.

    Я до сих под встречал алгоритмы, которые построены примерно так:
    Код (Text):
    1. ... HANDLE *h = WaitStruct->Handles;
    2. DWORD   a = WaitStruct->Count;
    3.  
    4. while (a)
    5. {
    6.   DWORD c = (a < MAXIMUM_WAIT_OBJECTS) ? a : MAXIMUM_WAIT_OBJECTS;
    7.   DWORD r = WaitForMultipleObjects(c, h, WaitStruct->WaitAll, WaitStruct->Miliseconds);
    8.  
    9.   // тут анализ результата работы WaitForMultipleObjects
    10.   // зависит от WaitStruct->WaitAll, WaitStruct->Miliseconds
    11.   ...
    12.  
    13.   p += c;
    14.   a -= c;
    15. }
    16. ...
    PS
    потому как файлов около 500 обычно
    Что будет если WaitNumber будет больше чем MAXIMUM_WAIT_OBJECTS, т.е. если файлов будет больше чем MAXIMUM_WAIT_OBJECTS * MAXIMUM_WAIT_OBJECTS?
     
  17. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    q_q

    ))) все просто - работать не будет (но я думаю что такого количества потоков уж точно не будет)

    Хм... может и в этом ошибка. Проверю - отпишусь
     
  18. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    WaitStruct->WaitAll - это понятно

    а как же проанализировать WaitStruct->Miliseconds?
     
  19. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    я потому и оформил в разные потоки чтобы не думать о том что с Милисекондс делать
     
  20. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Жаль что я не встретил такого алгоритма

    не подкинешь ссылочку?

    буду примного благодарен