Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Поиск Memory Leak

Автор: delover
Дата сообщения: 29.12.2010 05:56
В общем решается эта задача только ручками. Я написал простенький модуль с которым может разобраться даже студент. Идея состоит в том чтобы найти в дебаг коде место выделения теряемой памяти. То есть сделать точку останова, а дальше по окну стека вызовов или шажками дебага найти место и понять какая переменная была потеряна.
[more=Вот код]
Код: [no]unit FixMMgr;

interface

implementation

const
FStack = $12FC90;
FSize = 32;

var
SaveMemMgr: TMemoryManagerEx;
MMem: array[0..500000] of packed record
Data, St: Pointer; Size: Integer;
end;
MCnt: Integer = 0;

procedure FindedProc;
begin //<-break point
//System.Error(reControlBreak);
end;

function GetMIdx(P: Pointer): Integer;
begin
for Result := Low(MMem) to High(MMem)-1 do
begin
if MMem[Result].Data = P then Exit;
end;
System.Error(reInvalidPtr);
end;

function MyReallocMem(P: Pointer; Size: Integer): Pointer;
var
I: Integer;
begin
Result := SaveMemMgr.ReallocMem(P, Size);
I := GetMIdx(P);
MMem[I].Data := Result;
// if (MMem[I].St=Pointer(FStack)) and (Size=FSize) then
// FindedProc;
MMem[I].Size := Size;
end;

{$region ' [get free, init] '}
function MyGetMem(Size: Integer): Pointer;
var
P2: Pointer;
begin
P2 := @P2;
Result := SaveMemMgr.GetMem(Size);
MMem[MCnt].Data := Result;
MMem[MCnt].St := P2;
MMem[MCnt].Size := Size;
Inc(MCnt);
if (P2=Pointer(FStack)) and (Size=FSize) then
FindedProc;
end;

function MyAllocMem(Size: Cardinal): Pointer;
var
P2: Pointer;
begin
P2 := @P2;
Result := SaveMemMgr.AllocMem(Size);
MMem[MCnt].Data := Result;
MMem[MCnt].St := P2;
MMem[MCnt].Size := Size;
Inc(MCnt);
if (P2=Pointer(FStack)) and (Size=FSize) then
FindedProc;
end;

function MyFreeMem(P: Pointer): Integer;
var
I: Integer;
begin
I := GetMIdx(P);
Move(MMem[I+1], MMem[I], (MCnt-I)*SizeOf(MMem[0]));
Dec(MCnt);
Result := SaveMemMgr.FreeMem(P);
end;

procedure InitMyMemMgr;
var
MemMgr: TMemoryManagerEx;
begin
FillChar(MMem, SizeOf(MMem), 0);
GetMemoryManager(SaveMemMgr);
MemMgr := SaveMemMgr;
MemMgr.GetMem := MyGetMem;
MemMgr.AllocMem := MyAllocMem;
MemMgr.FreeMem := MyFreeMem;
MemMgr.ReallocMem := MyReallocMem;
SetMemoryManager(MemMgr);
ReportMemoryLeaksOnShutdown := True;
end;
{$endregion}

initialization
InitMyMemMgr;
finalization
SetMemoryManager(SaveMemMgr); //<-break point
end.
[/no]
Автор: volser
Дата сообщения: 29.12.2010 11:51
delover
Зачем велосипед изобретать? Чем FastMM не устраивает?
Автор: delover
Дата сообщения: 29.12.2010 13:13
volser
Проверьте пожалуста FastMM на следующий случай. Я присваиваю значение строке которая прописана в теле самого проекта. Возникает сообщение об утечке потому что после "end." проект не чистит память переменных описанных в теле проекта. Тут у меня был единственный случай когда я не мог понять окно стека...


Цитата:
Чем FastMM не устраивает?

1. Я его не знаю
2. Он сам громозкий и как говорят в Интернете (Дневник Дмитрия Тимохова)

Цитата:
Предполагается, что FastMM используется для отладки приложения. Это важно, т.к. FastMM, работающий в режиме отладки, серьезно тормозит выполнение программы.

3. На сколько я понял лог со стеком будет сброшен в файл. Согласитесь есть разница если этот лог находится сразу в "Call Stack Window" и я сразу могу потыкать все непонятные моменты и перейти в код во время отладки увидеть где я реально свалил?


Цитата:
Зачем велосипед изобретать?

1.Возможно FastMM и изобрёл велосипед но об этих возможностях я узнал едё давно из книги Рэя Лишнера "Secrets of Delphi2".
2. Мой код почитали? Он до тупого простой что даёт массу гибкости. Вы можете делать так же FillChar(Data,Size,$FFFF) после каждого FreeMem. Всё что угодно. Так что почитав про FreeMM я убедился что мне он не помог.

Добавлено:
Почитал статью в Википедии. Там "очень крутой программер" говорит что FastMM надо убрать из Вики, что Delphi юзают тока в дедсадешном возрасте и что C++ от микрософт "лохи". Он правдо своё ИМХО забыл поставить, это яко бы очевидно...
Автор: akaGM
Дата сообщения: 29.12.2010 14:38
а я с "детства" Eurekalog полюбил, особенно когда дельфийские длл'и надо было фигачить...

_http://www.eurekalog.com/details_delphi.php

а для Сей вот эта штука рулит:
http://www.deleaker.com/ru/
Автор: delover
Дата сообщения: 29.12.2010 21:22
akaGM
Еврика она по задумке не бесплатная.
Автор: akaGM
Дата сообщения: 29.12.2010 22:03
delover
ну, вообще говоря, дельфи тоже...
кому надо покупают, кто-то варезничает...
одно слово -- жисть...
Автор: delover
Дата сообщения: 30.12.2010 06:25
akaGM
Подрастёт кашелёк я куплю. Я знаком с Эврикой за триальный период в общем мне понравилось, только незнаю каким боком она мне меморилики поможет искать. Да и вообще искать утечки в DLL дело специфическое. Либо ты сам лох и мог наделать мемори ликов. Либо ты юзаеш библиотеки которые тестятся на меморилики через Exe на раз просто...

Добавлено:
Я смотрел репорты о мемориликах DLL это всё было только в теле проекта.

Добавлено:
У меня есть кусок кода который исправляет Delphi DLL для того чтобы они не оставляли занятую память могу скинуть сюда.
Автор: akaGM
Дата сообщения: 30.12.2010 12:57
delover

Цитата:
У меня есть кусок кода, могу скинуть сюда

мало сорсев не бывает,
кидай...
Автор: Rudia
Дата сообщения: 31.12.2010 09:08
delover

Цитата:
Подрастёт кашелёк я куплю. Я знаком с Эврикой за триальный период в общем мне понравилось, только незнаю каким боком она мне меморилики поможет искать.

На самом деле очень неплохо ищет, т.к. [more="сама отслеживает"]The EurekaLog Memory Leaks Detection has same limits derives from its internal structure.



EurekaLog detects the memory leaks at the program exit, so at this state the program has just freed all its non-static resources (resources allocated at run-time as Object created with the Create method, variables allocated with the GetMem function, or constants arrays).



This technique generating the following limitations:





1. currently this feature is available only in Delphi (not C++Builder);



2. the Leak report automatically hide the Assembler and CPU sections;



3. during the Leaks handling EurekaLog did not execute its events (this because all the needed memory resources are just freed);



4. a little performances decreasing (no more that about 5%);



5. a little memory usage increasing (about 300 bytes for every memory allocations);


6. EurekaLog can catches a max of 1024 leaks (to avoid the creation of a too BIG report file);



7. EurekaLog isn't able to catches memory leaks in projects compiled with Run-Time Packages.

[/more] выделение памяти. Без проблем находила единичные утечки в сложных проектах.
На самом деле, компоненты такого типа - мастхэв для коммерческой разработки.
Если же в релизы не пихать, а пользоваться только при тестировании, то можно и варезной без проблем обойтись.
Автор: akaGM
Дата сообщения: 31.12.2010 09:47
во, старшие товарищи поправили-поддержали...
и меня и Архимедову Эврику... :)

Страницы: 1

Предыдущая тема: types of actual and formal var parameters must be identical


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.