Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.15;
Скачать: CL | DM;

Вниз

Подскажите как просмотреть,что я создаю в куче.   Найти похожие ветки 

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

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


 
Digitman ©   (2002-07-24 11:45) [1]

А ты что, к кучам напрямую обращаешься ? Или таки пользуешься менеджером памяти по-умолчанию ?


 
Андрусь ©   (2002-07-24 12:00) [2]

Да нет.Просто при закрытии проги выскакивает CPU window,а в Event Log пишет

ODS: HEAP: Free Heap block 12cafe0 modified at 12cb188 after it was freed Process Str_Project.exe ($770)

Вот я и хочу поглядеть чего там не так.


 
Digitman ©   (2002-07-24 12:51) [3]

Что же ты расчитываешь там увидеть ? Его уже нет, хипа-то ...судя по диагностике отказа ...

а вот на "ODS" следует обратить внимание ! Именно эта подсистема сообщает об отказе ... это уже что-то ...


 
Андрусь ©   (2002-07-24 14:23) [4]

Что такое ODS - сам чего-то не доезжаю. Система сообщает о том,что я пытаюсь освободить то,что было освобождено. Но при этом не вываливает Access Violation,а CPU Window и причем при закрытии программы,а оно по идее вываливает когда нет кода,чтобы показать,где ошибка.


 
Digitman ©   (2002-07-24 14:26) [5]

Какие компоненты используешь в приложении ?


 
Андрусь ©   (2002-07-24 14:33) [6]

Odac - для доступа к ораклиной базе,DevExpress в качестве DataControls и своих там пару,но простеньких.


 
Андрусь ©   (2002-07-24 16:43) [7]

Не подскажите как под дебагером смотреть,что происходит по конкретному адресу памяти.


 
Андрусь ©   (2002-07-25 19:01) [8]

Алё мастера,где же вы!
Как посмотреть что там среда пытается освободить...


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


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

В окне CPU: меню - Go to adress


 
Андрусь ©   (2002-07-25 21:02) [10]

И что дальше ну провел меня CPU - там адресс и никакого кода,одни вопросы ?????. Да и по идее какой код в куче.


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

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


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

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

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


 
KIR ©   (2002-07-26 11:51) [13]

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


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

Код простой:

Open;

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


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


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


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

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

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

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


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

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


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

ODS - OutputDebugString.


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

ODS - OutputDebugString !


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

>SVM
И что.

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


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

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


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

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

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

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

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


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

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


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

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


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

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


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

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


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


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

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


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

Простейший тестовый менеджер можно написать за 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 18:09) [27]

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


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

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


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.15;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.015 c
1-48114
anod
2002-08-05 12:13
2002.08.15
ListView


14-48307
RomanKulhc
2002-07-18 19:23
2002.08.15
Vinchestery Fujitsu


1-48157
quark
2002-07-29 21:58
2002.08.15
как получит список файлов в папке учитывая вложенные?


7-48338
ol
2002-05-15 00:16
2002.08.15
вопрос по dll


4-48359
Volj
2002-06-05 14:38
2002.08.15
Как мне получить процент свободных ресурсов в Win98?