![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как просмотреть,что я создаю в куче. [D6, Win2k]
Андрусь © (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]Какой код, какие знаки вопросов? Левое нижнее окно(или какое там шестом) - содержимое памяти. В нем и щелкай! Ты спрашивал, как посмотреть содержимое памяти по некоторому адресу. Что ты там ожидаешь увидеть? И вообще, утечки ищутся другими средствами - мониторингом менеджера, анализом кода, пошаговой отладкой. У тебе программа останавливается - так посмотри стек вызовов, походи вокруг отладчиком, подумай над кодом, поищи в коде апишные запросы выделения памяти!