Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
ВнизПодскажите как просмотреть,что я создаю в куче. Найти похожие ветки
← →
Андрусь (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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.007 c