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


Автор: psergio 13.12.2006, 15:26
Подскажите как использовать модуль Memcheck для фиксирования утечек памяти....

Автор: skyboy 13.12.2006, 16:52
бросаешь его первым в список используемых модулей. вроде, все. там в архиве readme лежит - что, не нашел?

Добавлено @ 16:53 
Цитата(psergio @  13.12.2006,  14:26 Найти цитируемый пост)
фиксирования утечек памяти

он не исправляет утечки. он их только обнаруживает.

Автор: Alexeis 13.12.2006, 17:41
skyboy, зато фиксирует факт наличия утечки   smile 

Автор: Bose 14.12.2006, 19:01
Цитата(psergio @  13.12.2006,  15:26 Найти цитируемый пост)
Подскажите как использовать модуль Memcheck для фиксирования утечек памяти....

В исходном файле проекта(Project->View Source):
* в секции Uses первым модулем прописываешь Memcheck.
* после begin, но перед Application.Initialize; вписываешь MemChk;

В настройках проекта(Project->Options):
* на закладке Linker ставишь галочку Include TD32 Debug Info
* на закладке Compiler в группе Code Generation ставишь галочку Stack Frames.

После этого делаешь Build Project. И запускаешь программу. После завершения работы программы в папке с exe появится файл со списком утечек. А также, Delphi начнёт генерировать Exceptions на тех строках, где "скорее всего" и произошла сама утечка.

п.с. включив галочку Include TD32 Debug Info размер exe файла увеличится раз в 5(!), так что при создании финального билда Memcheck лучше отключить.


Автор: ilya198293 24.6.2007, 12:02
про модули ShareMem, FastShareMem (будем для простоты считать их одним и тем же) и Memcheck пишут что и то и другой должны быть первыми, а что первее?

Автор: Alexeis 24.6.2007, 12:12
  Вот что написано у них в FAQ
Цитата

Q8: Is there a problem with ShareMem ?

A: Yes. As far as I know, if your project uses ShareMem and you launch MemCheck, the program will fail with an invalid pointer operation error on termination. I don't know where this problem comes from. The error seems to occur when the FreeMem of the memory manager of ShareMem is called on program termination. However I don't understand what happens since the ShareMem unit does not have a finalization section. Any hint will be very welcome ! I think this prevents the use of MemCheck when writing a DLL.

Here is what David Fielder answers for this question:
I am using Memcheck alongside ShareMem just fine. I just make sure ShareMem is first, and Memcheck is second in the uses clause. ShareMem calls statically loads DelphiMM.dll, and frees the dll when the program terminates. So the error you get will be caused by DelphiMM.dll attempting to tidy up before being freed.

Hint ! Use FastSharemem (see Q16).

Автор: ilya198293 24.6.2007, 13:00
Сделал всё так как писа Bose.
При этом использую FastShareMem, но он описывается и используется в dll.
При завершении программа выдаёт ошибку "Runtime error 204 at 00405729", "Runtime error 216 at 004047CE" и зацикливается на ошибке "Runtime error 216 at 00407642".

При это отчётный файл выглядит так:
==============================================================================================================================
MemCheck version 2.75

TOP 10 Leaks: begin
Leak #0 User allocated memory (GetMem)
    Size: 20
    1 Occurence
    call stack - 0 :  Routine @System@@NewAnsiString Find error: 004057DD
    call stack - 1 :  Routine @Forms@TCustomForm@DoCreate Find error: 0046D01F
    call stack - 2 :  Routine @Forms@TCustomForm@AfterConstruction Find error: 0046CCDB
    call stack - 3 :  Routine @Forms@TCustomForm@Create Find error: 0046CCB1
    call stack - 4 :  Routine @Forms@TApplication@CreateForm Find error: 0047587C
    call stack - 5 : (no debug info) Find error: 0053ACA2
    call stack - 6 : (no debug info) Find error: 7C816D4B
    call stack - 7 : (no debug info) Find error: FFFFFFFC

Leak #1 User allocated memory (GetMem)
    Size: 18
    1 Occurence
    call stack - 0 :  Routine @System@@NewAnsiString Find error: 004057DD
    call stack - 1 :  Routine @Forms@TCustomForm@DoCreate Find error: 0046D01F
    call stack - 2 :  Routine @Forms@TCustomForm@AfterConstruction Find error: 0046CCDB
    call stack - 3 :  Routine @Forms@TCustomForm@Create Find error: 0046CCB1
    call stack - 4 :  Routine @Forms@TApplication@CreateForm Find error: 0047587C
    call stack - 5 : (no debug info) Find error: 0053ACA2
    call stack - 6 : (no debug info) Find error: 7C816D4B
    call stack - 7 : (no debug info) Find error: FFFFFFFC

Leak #2 User allocated memory (GetMem)
    Size: 16
    1 Occurence
    call stack - 0 : (no debug info) Find error: 0000083C

TOP 10 Leaks: end

Total leak: 54 bytes


*** MEMCHK: Blocks STILL allocated ***

Leak #0 User allocated memory (GetMem)
    Size: 20
    1 Occurence
    call stack - 0 :  Routine @System@@NewAnsiString Find error: 004057DD
    call stack - 1 :  Routine @Forms@TCustomForm@DoCreate Find error: 0046D01F
    call stack - 2 :  Routine @Forms@TCustomForm@AfterConstruction Find error: 0046CCDB
    call stack - 3 :  Routine @Forms@TCustomForm@Create Find error: 0046CCB1
    call stack - 4 :  Routine @Forms@TApplication@CreateForm Find error: 0047587C
    call stack - 5 : (no debug info) Find error: 0053ACA2
    call stack - 6 : (no debug info) Find error: 7C816D4B
    call stack - 7 : (no debug info) Find error: FFFFFFFC

Leak #1 User allocated memory (GetMem)
    Size: 18
    1 Occurence
    call stack - 0 :  Routine @System@@NewAnsiString Find error: 004057DD
    call stack - 1 :  Routine @Forms@TCustomForm@DoCreate Find error: 0046D01F
    call stack - 2 :  Routine @Forms@TCustomForm@AfterConstruction Find error: 0046CCDB
    call stack - 3 :  Routine @Forms@TCustomForm@Create Find error: 0046CCB1
    call stack - 4 :  Routine @Forms@TApplication@CreateForm Find error: 0047587C
    call stack - 5 : (no debug info) Find error: 0053ACA2
    call stack - 6 : (no debug info) Find error: 7C816D4B
    call stack - 7 : (no debug info) Find error: FFFFFFFC

Leak #2 User allocated memory (GetMem)
    Size: 16
    1 Occurence
    call stack - 0 : (no debug info) Find error: 0000083C

*** MEMCHK: End of allocated blocks ***


*** MEMCHK: Chronological leak information ***

* User allocated memory (GetMem) (Leak #2) Size: 16
* User allocated memory (GetMem) (Leak #1) Size: 18
* User allocated memory (GetMem) (Leak #0) Size: 20

*** MEMCHK: End of chronological leak information ***


*** MEMCHK: Blocks written to after destruction ***

    Bad blocks count: 0


*** MEMCHK: End of blocks written to after destruction ***
==============================================================================================================================
Что теперь это значит?

Автор: Bose 25.6.2007, 13:37
Это значит что у тебя не освобождается что-то, что выделяется в событии OnFormCreate. Причем дважды(Leak #0 и Leak #1).  
Цитата(ilya198293 @  24.6.2007,  13:00 Найти цитируемый пост)
При завершении программа выдаёт ошибку "Runtime error 204 at 00405729"

В конце работы MemCheck специально генерирует Exceptionы, в тех местах где выделяется память которая потом не освобождается . 


Кстати memcheck несовместим с FastMM. По крайней мере, мне не удалось заставить их нормально работать в паре. 

Автор: Alexeis 25.6.2007, 13:43
Цитата(Bose @  25.6.2007,  13:37 Найти цитируемый пост)
Кстати memcheck несовместим с FastMM. По крайней мере, мне не удалось заставить их нормально работать в паре.  

  Получается что в Delphi 2007 уже нельзя его юзать...

Автор: Bose 26.6.2007, 00:49
Цитата(Bose @  25.6.2007,  13:37 Найти цитируемый пост)
Кстати memcheck несовместим с FastMM. По крайней мере, мне не удалось заставить их нормально работать в паре. 


Цитата(Alexeis @  25.6.2007,  13:43 Найти цитируемый пост)
Получается что в Delphi 2007 уже нельзя его юзать...


Я недолго изучал эту проблему. 

В принципе, FastMM умеет отслеживать утечки памяти, и лог пишёт намного более подробный(настолько подробный, что я с ним так и не разобрался толком). Единственное, что более приятно при использовании memcheck - это генерация exception-ов прямо в тех местах кода, где была выделена неосвобождённая память. 

Автор: Snowy 26.6.2007, 00:54
В Delphi 2007 FastMM поставляется в урезанном виде.
Для полной отладки нужно скачать с оффсайта и в инклудах активировать нужные опции.

Автор: ilya198293 28.9.2007, 06:47
А что должно произойти если утечек памяти нет?
Я просто создал новый проект и сделал
Цитата

В исходном файле проекта(Project->View Source):
* в секции Uses первым модулем прописываешь Memcheck.
* после begin, но перед Application.Initialize; вписываешь MemChk;

В настройках проекта(Project->Options):
* на закладке Linker ставишь галочку Include TD32 Debug Info
* на закладке Compiler в группе Code Generation ставишь галочку Stack Frames.

После этого делаешь Build Project. И запускаешь программу. После завершения работы программы в папке с exe появится файл со списком утечек. А также, Delphi начнёт генерировать Exceptions на тех строках, где "скорее всего" и произошла сама утечка.

п.с. включив галочку Include TD32 Debug Info размер exe файла увеличится раз в 5(!), так что при создании финального билда Memcheck лучше отключить.

при закрытии пустой формы пишет вот такое:
==========================================================
MemCheck version 2.75

TOP 10 Leaks: begin
Leak #0 User allocated memory (GetMem)
    Size: 16
    1 Occurence
    call stack - 0 : (no debug info) Find error: 0000FFFF

TOP 10 Leaks: end

Total leak: 16 bytes


*** MEMCHK: Blocks STILL allocated ***

Leak #0 User allocated memory (GetMem)
    Size: 16
    1 Occurence
    call stack - 0 : (no debug info) Find error: 0000FFFF

*** MEMCHK: End of allocated blocks ***


*** MEMCHK: Chronological leak information ***

* User allocated memory (GetMem) (Leak #0) Size: 16

*** MEMCHK: End of chronological leak information ***


*** MEMCHK: Blocks written to after destruction ***

    Bad blocks count: 0


*** MEMCHK: End of blocks written to after destruction ***
==========================================================
и начали сыпаться ошибки с  текстом Runtime error 217 at 0040DDB6.
Что это вообще значит и может есть где небольшой мануальчик по работе с MemCheck?

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