Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите как просмотреть,что я создаю в куче. [D6, Win2k]


Страницы:   1 2

Андрусь ©   (2002-07-24 10:51:00) 

Привет всем! Подскажите как просмотреть,что я создаю в куче.
Зараннее всем спасибо.


Андрусь   (2002-08-01 14:31:00) [1]

Вообще,как узнать,что за переменная по данному адресу.


Андрусь   (2002-08-01 14:29:00) [2]


был немного занят отвлечёнными делами...

Дело в том,что GetMem я не использую..
Динамический массив юзаю,но через array of..;SetLength();Закоментарив его использование ошибка всё равно вылазит.
Дело всё в моих пакетах. При перекомпиляции проекта без пакетов,а всего в одном файле - ошибки нет.


Набережных С.   (2002-07-29 18:51:00) [3]

Денег всегда нет:) А что с MemCheck? Сам я им почти не пользовался, но по отзывам - вполне приличный. И еще, на всякий случай упомяну, от греха... Если использовать своего менеджера в многопоточной проге, то, соответственно, нужно предусмотреть синхронизацию, ну типа
if ismultithread then entercriticalsection...
Еще. Тебе ведь известен адрес, вот ипопробуй локализоваться с помощью моего "примера":) Он конечно совсем сырой, но вдруг поможет. Создай при инициализации файл CreateFile и пиши в него все обращения к этому адресу, а заодно и к соседним:) Потом поставь счетчик на последнее обращения и сгенери исключение, а тогда уже смотри - кто, где и когда.


Андрусь   (2002-07-29 18:09:00) [4]

А где его взять. NuMega BoundsChecker он платный,денег как сами понимаете нет...


Набережных С.   (2002-07-29 17:47:00) [5]

Простейший тестовый менеджер можно написать за 10 минут. Реализуешь 3 функции - GetMem, FreeMem, ReallocMem, которые после проверок переадресуют вызов стандартным Sys... вот и все.
Короче, вот пример, прям сейчас набрал, причешишь, приспособишь как надо.
И посмотри исходник стандартного менеджера, какие проблемы?

uses
SysUtils;

implementation

var
MinAddr:Integer = $555555;
MaxAddr:Integer = $555666;
CountMax:integer = 3;
AllocCount:integer = 0;
FreeCount: integer = 0;

function ASysFreeMem(p: Pointer): Integer;
begin
if (Integer(P) >= MinAddr)and(Integer(P) <= MaxAddr)then
begin
Inc(FreeCount);
if FreeCount >= CountMax then Raise Exception.CreateFmt("Free address %p, Step %d",[P,FreeCount]);
end;
Result:=SysFreeMem(p);
end;

function ASysGetMem(size: Integer): Pointer;
begin
Result:=SysGetMem(size);
if (Integer(Result) >= MinAddr)and(Integer(Result) <= MaxAddr)then
begin
Inc(AllocCount);
if AllocCount >= CountMax then Raise Exception.CreateFmt("Allocate address %p, Step %d",[Result,AllocCount]);
end;
end;

function ASysReallocMem(p: Pointer; size: Integer): Pointer;
begin
if (Integer(P) >= MinAddr)and(Integer(P) <=MaxAddr)then
begin
Inc(FreeCount);
if FreeCount >= CountMax then Raise Exception.CreateFmt("Free address %p, Step %d",[P,FreeCount]);
end;
Result:=SysReallocMem(p,size);
if (Integer(Result) >= MinAddr)and(Integer(Result) <=MaxAddr)then
begin
Inc(AllocCount);
if AllocCount >= CountMax then Raise Exception.CreateFmt("Allocate address %p, Step %d",[Result,AllocCount]);
end;
end;

var
OldMemoryManager: TMemoryManager;

procedure InitMemoryManager;
var
SharedMemoryManager: TMemoryManager;
begin
GetMemoryManager(OldMemoryManager);
SharedMemoryManager.GetMem := ASysGetMem;
SharedMemoryManager.FreeMem := ASysFreeMem;
SharedMemoryManager.ReallocMem := ASysReallocMem;

SetMemoryManager(SharedMemoryManager);
end;

initialization
InitMemoryManager;

finalization
SetMemoryManager(OldMemoryManager);

end.

С тем же успехом можно писать в лог-файл. Укажи его в uses, только НЕ ПЕРВЫМ В ДПР!
Но в принципе, Игорь Шевченко прав. Лучше возьми готовый, а то пока разберешься - время потеряешь. А это оставь на потом.


Андрусь   (2002-07-29 17:36:00) [6]


Это простейший способ, которому 1000 лет.
<i/>
Наверное к нему...

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


Игорь Шевченко   (2002-07-29 17:14:00) [7]

Андрусь © (29.07.02 16:43)


> А на счёт того как реализовать то о чём говорил Набережных
> С.

Наверное, это надо к нему обращаться ?


Андрусь   (2002-07-29 16:43:00) [8]

А на счёт того как реализовать то о чём говорил Набережных С.


Игорь Шевченко   (2002-07-29 16:26:00) [9]

www.google.com - ключевые слова NuMega BoundsChecker. Насчет скачать - не знаю, может, демо-версия где-то есть. В любом случае это быстрее, чем писать менеджер памяти.


Андрусь   (2002-07-29 16:16:00) [10]

Что это такое и где можно скачать,если полезная штучка.

Вообще-то я имел в виду слова Набережных С.

Пишешь свой менеджер памяти, который при обращении к интересующей тебя области+твой счетчик генерит исключение

Как это реализовать.


Игорь Шевченко   (2002-07-29 15:52:00) [11]

Проще BoundsChecker купить


Андрусь   (2002-07-29 15:36:00) [12]

>SVM
И что.

Как писать свой манагер памяти - подскажите чего по делу.


SVM   (2002-07-29 13:14:00) [13]

ODS - OutputDebugString !


SVM   (2002-07-29 13:14:00) [14]

ODS - OutputDebugString.


Андрусь   (2002-07-29 12:35:00) [15]

>Набережных С.
Абсолютно согласен,раз влип - нужно действовать.Не совсем понял про менеджер памяти - может торможу,может просто не знаю,если не сложно просветите,скачал MemCheck - валят ошибки при вызове.При подключении ShareMem - стало вываливать "Invalid pointer operation".


Набережных С.   (2002-07-26 19:37:00) [16]


> Андрусь © (26.07.02 11:44)


> Что такое мониторинг менеджера - ?

Элементарно, Ватсон! Пишешь свой менеджер памяти, который при обращении к интересующей тебя области+твой счетчик генерит исключение. Остановился-посмотрел стек вызовов.Это простейший способ, которому 1000 лет. Можно так-же использовать включенную в файл отладочную информацию - посмотри хотя-бы тот-же MemCheck. В общем думать надо, извилинами шевелить. Раз уж влип в это дело, то придется самому выкарабкиваться, никто тебе дистанционно не поможет. Зато знаний прибавится :)

> Андрусь © (26.07.02 12:46)

Попробуй использовать ShareMem


Андрусь   (2002-07-26 12:46:00) [17]

Код простой:

Open;

Т.е. не открываю датасет и всё в порядке.
База Оракловая - доступ через Odac.
Там всё довольно сложно и замарочено.
Делаю МДИ с подгружаемыми пакетами(см. конференции - я уже неделю почти мучаюсь - от Непонятки с подгружаемыми модулями (Андрусь 25.07.02 17:42).Как сам сейчас начинаю думать - я использую этот Query сразу в главной форме,а затем в форме,подгруженной в пакете. При закрытии приложения освобождается память при выгрузке пакета,а затем пытается ещё из главной формы.


KIR   (2002-07-26 11:51:00) [18]

Приведи код этой области


Андрусь   (2002-07-26 11:44:00) [19]

В том то и дело,что уже не знаю чего и делать - всё перепробывал.
Локализовал область программы,убрав которую ошибки не возникает,но там ничего плохого не видно.

Что такое мониторинг менеджера - ?


Набережных С.   (2002-07-25 22:51:00) [20]

Какой код, какие знаки вопросов? Левое нижнее окно(или какое там шестом) - содержимое памяти. В нем и щелкай! Ты спрашивал, как посмотреть содержимое памяти по некоторому адресу. Что ты там ожидаешь увидеть? И вообще, утечки ищутся другими средствами - мониторингом менеджера, анализом кода, пошаговой отладкой. У тебе программа останавливается - так посмотри стек вызовов, походи вокруг отладчиком, подумай над кодом, поищи в коде апишные запросы выделения памяти!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо