Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-48125
DenKop
2002-08-01 01:16
2002.08.15
Драйвер устройства


3-48012
cooluser
2002-07-28 08:59
2002.08.15
Просмтор содержимого БД. TListView


7-48323
ol
2002-05-31 10:17
2002.08.15
как посчитать контрольную суму посылки в ком порт


1-48018
xyz
2002-08-02 22:40
2002.08.15
STRING - название для нового раздела этого форума!


1-48091
EternalWonderer
2002-08-05 11:25
2002.08.15
Как





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский