![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Здравствуйте !
Допустим, у нас есть такой код:
Он нормально работает и рапорта об утечках памяти не выдает. Теперь попробуем его пройти таким образом: Ставим брякпоинт на строке writeln(Obj.Str) Запускаем программу, дебагер останавливается на указаной строке. Наводим мышь на "Str" в этой строке и дожидаемся появления хинта со значением свойства Str. Жмем F9. В результате получаем сообщение об утечке памяти. Наблюдается в CodeGear™ Delphi® 2009 Version 12.0.3210.17555 (то есть с первым и вторым апдейтами) Подскажите, пожалуйста, с чем это может быть связано, как с этим бороться и как мне в будущем отличать настоящие утечки от "глючных" (если конечно это глюк среды) ? -------------------- Обижено школьников: 8 |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Глюк среды, однозначно. Странно, что он возникает при чтении. А есть поставить FastMM в FullDebugMode, куда будет вести CallStack? (опции Use Debug DCUs, Stack Frames лучше бы включить)
Собственно отладчик довольно активно участвует в работе программы. Он может и менять её память и вызывать функции менеджера памяти. Это довольно очевидно, хотя об этом мало кто помнит. Например: когда вы меняете строковую переменную, то отладчик не может же просто взять и изменить память под данные строки, т.к. длина строки может измениться. Он вынужден выделить новую строчку GetMem-ом, а старую освободить FreeMem-ом. И всё это, пока программа стоит на паузе! С её точки зрения это довольно удивительно. В данном конкретном случае отладчик вынужден сделать вызов функции, чтобы узнать значение строки. Хотя в данном конкретном случае никакого выделения памяти происходить не может: мы ведь констранту возвращаем. Добавлено через 14 минут и 41 секунду Посмотрел сам. Вот что получилось:
0x1C68 - это главный поток. А вот 20036 - это хз кто. Видать, отладчик. Похоже, новая строка всё же создаётся (вижу вызов NewUnicodeString). Хотя неясно зачем. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Посмотрим, что скажут: QC Report #73762.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Но почему выделяется память под константу, это половина вопроса. А другая половина: а почему бы дебаггеру ее потом не освободить?
-------------------- Обижено школьников: 8 |
|||
|
||||
Mechanic |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
Аглицкие мастера, поди, брэйк/трейсом мемлики не ловют.. ![]() Это сообщение отредактировал(а) Mechanic - 14.5.2009, 05:21 --------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Mechanic, так я понимаю это CodeMonkey и написал
-------------------- There are always someone smarter than you... |
|||
|
||||
Mechanic |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
MetalFan, понял то же, но позже.. Сбило с толку слово Workaround.
![]() Но ведь кажется в самом деле, самым приемлемым вариантом. Имхо, мемлик - это вещь, для отлова которой не нужен трейс, достаточно и тестовых прогонов. --------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
Mechanic |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
Во намудрил..
![]() Понятно, что плохо без любой доп. возможности. Не есть хорошо, когда что-то не работает. Просто после этой статьи, мне например, не придёт в голову гоняться с трейсом за призраками. Лучше уж я лишний OutputDebugMessage вставлю, не развалюсь. Посему, за труд, и за сигнал - поклон вам, bems & CodeMonkey! И крепких нам всем нервов, и.. Удачной Охоты! ![]() --------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |