Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка памяти при пошаговой отладке, D2009 
:(
    Опции темы
bems
Дата 9.5.2009, 02:14 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Здравствуйте !
Допустим, у нас есть такой код:
Код

program ToLeakOrNotToLeak;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type TClss = class
             strict private
              function GetString: string;
             public
              property Str: string read GetString;
             end;

function TClss.GetString: string;
begin
Result := 'string'
end;

var Obj: TClss;
begin
  try
    ReportMemoryLeaksOnShutdown := True;
    Obj := TClss.Create;
    try
     writeln(Obj.Str);
    finally
     Obj.Free
    end;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.


Он нормально работает и рапорта об утечках памяти не выдает.
Теперь попробуем его пройти таким образом:
Ставим брякпоинт на строке writeln(Obj.Str)
Запускаем программу, дебагер останавливается на указаной строке.
Наводим мышь на "Str" в этой строке и дожидаемся появления хинта со значением свойства Str.
Жмем F9.

В результате получаем сообщение об утечке памяти.
Наблюдается в CodeGear™ Delphi® 2009  Version 12.0.3210.17555 (то есть с первым и вторым апдейтами)

Подскажите, пожалуйста, с чем это может быть связано, как с этим бороться
и как мне в будущем отличать настоящие утечки от "глючных" (если конечно это глюк среды) ?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 9.5.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Глюк среды, однозначно. Странно, что он возникает при чтении. А есть поставить FastMM в FullDebugMode, куда будет вести CallStack? (опции Use Debug DCUs, Stack Frames лучше бы включить)

Собственно отладчик довольно активно участвует в работе программы. Он может и менять её память и вызывать функции менеджера памяти. Это довольно очевидно, хотя об этом мало кто помнит. Например: когда вы меняете строковую переменную, то отладчик не может же просто взять и изменить память под данные строки, т.к. длина строки может измениться. Он вынужден выделить новую строчку GetMem-ом, а старую освободить FreeMem-ом. И всё это, пока программа стоит на паузе! С её точки зрения это довольно удивительно.

В данном конкретном случае отладчик вынужден сделать вызов функции, чтобы узнать значение строки. Хотя в данном конкретном случае никакого выделения памяти происходить не может: мы ведь констранту возвращаем.

Добавлено через 14 минут и 41 секунду
Посмотрел сам.

Вот что получилось:

Код
This block was allocated by thread 0x1C68, and the stack trace (return addresses) at the time was:
405843 [System.pas][System][System.@NewUnicodeString][18113]
4052CC [System.pas][System][System.@UStrAsg][16885]
40F24F [Project8.dpr][Project8][Project8.TClss.GetString][17]
20036 
77674911 [BaseThreadInitThunk]
77C8E4B6 [Unknown function at RtlInitializeExceptionChain]
77C8E489 [Unknown function at RtlInitializeExceptionChain]


0x1C68 - это главный поток.
А вот 20036 - это хз кто. Видать, отладчик. Похоже, новая строка всё же создаётся (вижу вызов NewUnicodeString). Хотя неясно зачем.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
CodeMonkey
Дата 9.5.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Посмотрим, что скажут: QC Report #73762.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bems
Дата 9.5.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Но почему выделяется память под константу, это половина вопроса. А другая половина: а почему бы дебаггеру ее потом не освободить?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Mechanic
Дата 14.5.2009, 05:15 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(CodeMonkey @  9.5.2009,  14:02 Найти цитируемый пост)
Посмотрим, что скажут: QC Report #73762. 


Цитата

 Workarounds
Don't use memory leak detection while debugging.


Аглицкие мастера, поди, брэйк/трейсом мемлики не ловют.. smile

Это сообщение отредактировал(а) Mechanic - 14.5.2009, 05:21
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
MetalFan
Дата 14.5.2009, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Mechanic, так я понимаю это CodeMonkey и написал


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Mechanic
Дата 14.5.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



MetalFan, понял то же, но позже.. Сбило с толку слово Workaround.  smile 

Но ведь кажется в самом деле, самым приемлемым вариантом. Имхо, мемлик - это вещь, для отлова которой не нужен трейс, достаточно и тестовых прогонов.
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
bems
Дата 14.5.2009, 17:58 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Mechanic @  14.5.2009,  08:51 Найти цитируемый пост)
Имхо, мемлик - это вещь, для отлова которой не нужен трейс, достаточно и тестовых прогонов. 
Да, но именно для отлова. Когда мы знаем что он есть и ловим его. А когда мы отлаживаем код в котором не замечено утечек памяти и вдруг видим сообщение, то начинаем искать ситуацию ,когда лик повторяется. И в процессе этого поиска не пользуемся отладчиком, поэтому лик не повторяется. Мы в шоке, потому что ищем то чего нет. После этого моего топика мы знаем что отладчик имеет побочный эффект и теперь можем не искать то чего нет, чтоб доказать что его не существует. Решает ли это проблему? Нет, только создаёт. Теперь если в программе при редких условиях течёт память, и мы помним что в текущем сеансе пользовались дебагером, то мы списываем все на него, а лик благополучно остается в коде.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Mechanic
Дата 18.5.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Во намудрил..  smile 
Понятно, что плохо без любой доп. возможности. Не есть хорошо, когда что-то не работает.
Просто после этой статьи, мне например, не придёт в голову гоняться с трейсом за призраками.
Лучше уж я лишний OutputDebugMessage вставлю, не развалюсь.

Посему, за труд, и за сигнал - поклон вам, bems & CodeMonkey!
И крепких нам всем нервов, и.. Удачной Охоты!  smile 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.