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

Вниз

Очередной баг. Утечка памяти   Найти похожие ветки 

 
oxffff ©   (2007-10-10 20:22) [0]

Опубликовал отчет почти две недели назад. Молчат

Пример

TXAB=class(TInterfacedObject)
public
destructor destroy;override;
end;

SampleRecord=record
A:Iunknown;
b:integer;
constructor create(b:integer);overload;
constructor create(a:Iunknown);overload;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:SampleRecord;
   b,c:string;
begin
a.create(TXAB.Create);
if not assigned(a.A) then showmessage("Memory leak. Instance of TXAB exists, but no ref to it");
end;

{ SampleRecord }

constructor SampleRecord.create(b: integer);
begin
self.b:=b;
end;

constructor SampleRecord.create(a: IInterface);
begin
self.A:=a;
create(1);
end;

{ TXAB }

destructor TXAB.destroy;
begin
showmessage("Object is under Destruction");
inherited;
end;


 
Rouse_ ©   (2007-10-10 20:49) [1]

Сообщение "Memory leak. ..." не показывается...
2007


 
oxffff ©   (2007-10-10 20:58) [2]


> Rouse_ ©   (10.10.07 20:49) [1]
> Сообщение "Memory leak. ..." не показывается...
> 2007


А в 2006 показывает.
А ты не мог бы сказать вызывается ли в конструкторе записи вначале
неявно InitializeRecord?


 
oxffff ©   (2007-10-10 21:55) [3]


> А в 2006 показывает.
> А ты не мог бы сказать вызывается ли в конструкторе записи
> вначале
> неявно InitializeRecord?


Rouse

Посмотри пожалуйста в 2007 под отладчиком.
Заранее благодарен.
А то инет у меня пока не безлимитный. Скачать 2007 не могу.


 
Kolan ©   (2007-10-10 22:00) [4]

> Посмотри пожалуйста в 2007 под отладчиком.

Объясни для тупых как это(неявно) посмотреть?


 
Kolan ©   (2007-10-10 22:01) [5]

constructor SampleRecord.create(b: integer);
begin
self.b:=b;
end; //тут точка останова


Стек:
Unit1.SampleRecord.create(???)
Unit1.SampleRecord.create(TInterfacedObject($A75080) as IInterface)
Unit1.TForm1.Button1Click(???)
:0043cab2 TControl.Click + $6A
:004404b3 TWinControl.WndProc + $4FF
:00429af1 TButtonControl.WndProc + $71
:00440604 DoControlMsg + $28
:004404b3 TWinControl.WndProc + $4FF
:00450b22 TCustomForm.WndProc + $536
:0043fbdb TWinControl.MainWndProc + $2F
:0041b4b2 StdWndProc + $16
:77d38709 USER32.GetDC + 0x72
:77d387eb ; C:\WINDOWS\system32\USER32.dll
:77d3b743 ; C:\WINDOWS\system32\USER32.dll
:77d3b7ab USER32.SendMessageW + 0x49


 
oxffff ©   (2007-10-10 22:09) [6]


> Kolan ©   (10.10.07 22:00) [4]
> > Посмотри пожалуйста в 2007 под отладчиком.
>
> Объясни для тупых как это(неявно) посмотреть?


Здесь нет тупых. :)

Поставить бряк на a.create(TXAB.Create);

Запустить приложение нажать кнопку.

Далее нажать crtl+alt+C.

Появится отладчик.

Пролистать вверх. Так должен быть вызов
call InitializeRecord перед тем местом где мы остановились.

Далее нажать F8 до call SampleRecord.create.

На SampleRecord.create нажать F7.
Далее посмотреть, есть ли в SampleRecord.create вызов  
call InitializeRecord.
Если нет, значит в 2007 исправили баг.

Заранее благодарен.


 
oxffff ©   (2007-10-10 22:14) [7]

Хотя проще поставить бряк сразу на

constructor SampleRecord.create(a: IInterface);
begin                                                                 <- Бряк здесь
self.A:=a;
create(1);
end;

Далее нажать crtl+alt+C.
И посмотреть есть ли вызов call InitializeRecord


 
Rouse_ ©   (2007-10-10 22:33) [8]


> Хотя проще поставить бряк сразу на
>
> constructor SampleRecord.create(a: IInterface);
> begin                                                  
>               <- Бряк здесь
> self.A:=a;
> create(1);
> end;


Unit6.SampleRecord.create(TInterfacedObject($A75080) as IInterface)
Unit6.TForm6.Button1Click(???)
:0043bfb6 TControl.Click + $6A
:0043faa7 TWinControl.WndProc + $4FF
:00429b39 TButtonControl.WndProc + $71
:0043fbf8 DoControlMsg + $28
:0043faa7 TWinControl.WndProc + $4FF
:00450c40 TCustomForm.WndProc + $558
:0043f1cf TWinControl.MainWndProc + $2F
:0041b4b2 StdWndProc + $16
:7e418734 USER32.GetDC + 0x6d
:7e418816 ; C:\WINDOWS\system32\USER32.dll
:7e41b89b ; C:\WINDOWS\system32\USER32.dll
:7e41b903 USER32.SendMessageW + 0x49


Ну и...

Unit6.pas.46: begin
0045ACD8 55               push ebp
0045ACD9 8BEC             mov ebp,esp
0045ACDB 83C4F8           add esp,-$08
0045ACDE 8955FC           mov [ebp-$04],edx
0045ACE1 8945F8           mov [ebp-$08],eax
0045ACE4 8B45FC           mov eax,[ebp-$04]
0045ACE7 E878B3FAFF       call @IntfAddRef
0045ACEC 33C0             xor eax,eax
0045ACEE 55               push ebp
0045ACEF 6828AD4500       push $0045ad28
0045ACF4 64FF30           push dword ptr fs:[eax]
0045ACF7 648920           mov fs:[eax],esp
Unit6.pas.47: self.A:=a;
0045ACFA 8B45F8           mov eax,[ebp-$08]
0045ACFD 8B55FC           mov edx,[ebp-$04]
0045AD00 E803B3FAFF       call @IntfCopy
Unit6.pas.48: create(1);
0045AD05 8B45F8           mov eax,[ebp-$08]
0045AD08 BA01000000       mov edx,$00000001
0045AD0D E8B2FFFFFF       call SampleRecord.create
Unit6.pas.49: end;
0045AD12 33C0             xor eax,eax
0045AD14 5A               pop edx
0045AD15 59               pop ecx
0045AD16 59               pop ecx
0045AD17 648910           mov fs:[eax],edx
0045AD1A 682FAD4500       push $0045ad2f
0045AD1F 8D45FC           lea eax,[ebp-$04]
0045AD22 E8C9B2FAFF       call @IntfClear
0045AD27 C3               ret


 
oxffff ©   (2007-10-10 22:45) [9]


> Rouse_ ©   (10.10.07 22:33) [8]


Вот код который генерит 2006.

SampleRecord.create:
00457F94 55               push ebp
00457F95 8BEC             mov ebp,esp
00457F97 83C4F8           add esp,-$08
00457F9A 8955FC           mov [ebp-$04],edx
00457F9D 8945F8           mov [ebp-$08],eax
00457FA0 8B45F8           mov eax,[ebp-$08]                  <-
00457FA3 8B15507F4500     mov edx,[$00457f50]           <-
00457FA9 E876D1FAFF       call @InitializeRecord            <-
00457FAE 8B45FC           mov eax,[ebp-$04]
00457FB1 E80EDFFAFF       call @IntfAddRef
00457FB6 33C0             xor eax,eax
00457FB8 55               push ebp
00457FB9 68F27F4500       push $00457ff2
00457FBE 64FF30           push dword ptr fs:[eax]
00457FC1 648920           mov fs:[eax],esp
00457FC4 8B45F8           mov eax,[ebp-$08]
00457FC7 8B55FC           mov edx,[ebp-$04]
00457FCA E899DEFAFF       call @IntfCopy
00457FCF 8B45F8           mov eax,[ebp-$08]
00457FD2 BA01000000       mov edx,$00000001
00457FD7 E898FFFFFF       call SampleRecord.create
00457FDC 33C0             xor eax,eax
00457FDE 5A               pop edx
00457FDF 59               pop ecx
00457FE0 59               pop ecx
00457FE1 648910           mov fs:[eax],edx
00457FE4 68F97F4500       push $00457ff9
00457FE9 8D45FC           lea eax,[ebp-$04]
00457FEC E85FDEFAFF       call @IntfClear
00457FF1 C3               ret

Соответствено в 2007 уже поправили. Это радует


 
oxffff ©   (2007-10-10 22:46) [10]


> Rouse_ ©   (10.10.07 22:33) [8]


Огромное спасибо за проверку в 2007.


 
Суслик ©   (2007-10-10 23:47) [11]

Сергей, вот что я хочу тебе посоветовать.

Тестирование как таковое не очень интересно большинству. Оно даже не интересно многим допущенным к бета-тестам. Я не говорю, что это плохо - у всех свои дела.

Я бы тебе советовал постить баги генерации кода и rtl в группы:
1. Если ты допущен к beta-тесту, то в codegear.private.fieldtest.h2.compilter.
2. Если не допущен, то в public... (не помню точно) ... basm.

За промоут багов в internal database по теме компиляции кода и RTL отвечает Пьер Ле Ришь.

Постить нужно примерно так:

Title : Build # <build.number> QC <report number>
Body:
Build # <build.number>
QC <report number>
<report description>

PS build.number - номер билда второй с конца в полном номере билда.

Только тебе нужно как-то иметь последнюю версию дельфи. Как это сделать - не знаю. Может и тестовую можно потавить. Иначе ты будешь указывать на баги в прошлом билде, что не есть здорово для разработчиков, ибо они сконцентрированы на последнем билде.


 
Kolan ©   (2007-10-11 07:28) [12]

> call InitializeRecord перед тем местом где мы остановились.

0045A89E 8D45F8           lea eax,[ebp-$08]
0045A8A1 8B1574A84500     mov edx,[$0045a874]
0045A8A7 E814AAFAFF       call @InitializeRecord
0045A8AC 33C0             xor eax,eax
0045A8AE 55               push ebp
0045A8AF 6803A94500       push $0045a903
0045A8B4 64FF30           push dword ptr fs:[eax]
0045A8B7 648920           mov fs:[eax],esp
Unit1.pas.49: a.create(TXAB.Create);
0045A8BA B201             mov dl,$01



> На SampleRecord.create нажать F7.

После F7 попал на выделеную строку
Unit1.pas.61: begin
0045A964 55               push ebp
0045A965 8BEC             mov ebp,esp
0045A967 83C4F8           add esp,-$08
0045A96A 8955FC           mov [ebp-$04],edx
0045A96D 8945F8           mov [ebp-$08],eax
0045A970 8B45FC           mov eax,[ebp-$04]
0045A973 E8ECB6FAFF       call @IntfAddRef
0045A978 33C0             xor eax,eax
0045A97A 55               push ebp
0045A97B 68B4A94500       push $0045a9b4
0045A980 64FF30           push dword ptr fs:[eax]
0045A983 648920           mov fs:[eax],esp


Выходит нет??? Или что-то не так&#133


> Хотя проще поставить бряк сразу на

Unit1.pas.62: self.A:=a;
0045A986 8B45F8           mov eax,[ebp-$08]
0045A989 8B55FC           mov edx,[ebp-$04]
0045A98C E877B6FAFF       call @IntfCopy
Unit1.pas.63: create(1);
0045A991 8B45F8           mov eax,[ebp-$08]
0045A994 BA01000000       mov edx,$00000001
0045A999 E8B2FFFFFF       call SampleRecord.create


 
Kolan ©   (2007-10-11 07:32) [13]

DBS 2006

Unit1.pas.49: a.create(TXAB.Create);
00457E96 B201             mov dl,$01
00457E98 A1FC7D4500       mov eax,[$00457dfc]
00457E9D E886B9FAFF       call TObject.Create
00457EA2 8BD0             mov edx,eax
00457EA4 85D2             test edx,edx
00457EA6 7403             jz $00457eab
00457EA8 83EAF8           sub edx,-$08
00457EAB 8D45F8           lea eax,[ebp-$08]
00457EAE E88D000000       call SampleRecord.create


Unit1.pas.62: self.A:=a;
00457F62 8B45F8           mov eax,[ebp-$08]
00457F65 8B55FC           mov edx,[ebp-$04]
00457F68 E8F7DEFAFF       call @IntfCopy
Unit1.pas.63: create(1);
00457F6D 8B45F8           mov eax,[ebp-$08]
00457F70 BA01000000       mov edx,$00000001
00457F75 E8B2FFFFFF       call SampleRecord.create


Что-то я не понял в BDS вроде тоже нет InitializeRecord


 
oxffff ©   (2007-10-11 08:36) [14]


> Суслик ©   (10.10.07 23:47) [11]
> Сергей, вот что я хочу тебе посоветовать.
>
> Тестирование как таковое не очень интересно большинству.
>  Оно даже не интересно многим допущенным к бета-тестам.
> Я не говорю, что это плохо - у всех свои дела.
>
> Я бы тебе советовал постить баги генерации кода и rtl в
> группы:
> 1. Если ты допущен к beta-тесту, то в codegear.private.fieldtest.
> h2.compilter.
> 2. Если не допущен, то в public... (не помню точно) ...
> basm.
>
> За промоут багов в internal database по теме компиляции
> кода и RTL отвечает Пьер Ле Ришь.
>
> Постить нужно примерно так:
>
> Title : Build # <build.number> QC <report number>
> Body:
> Build # <build.number>
> QC <report number>
> <report description>
>
> PS build.number - номер билда второй с конца в полном номере
> билда.
>
> Только тебе нужно как-то иметь последнюю версию дельфи.
> Как это сделать - не знаю. Может и тестовую можно потавить.
>  Иначе ты будешь указывать на баги в прошлом билде, что
> не есть здорово для разработчиков, ибо они сконцентрированы
> на последнем билде.


Спасибо за совет.
Сейчас у нас безлимит в городе 64Кбит 550р.
Так что ищу другие варианты. :)


 
oxffff ©   (2007-10-11 08:48) [15]

Kolan ©   [12]
Kolan ©   [13]


> Что-то я не понял в BDS вроде тоже нет InitializeRecord


У меня 10.0.2558.35231 Update 2.
И в конструкторе есть вызов InitializeRecord, хотя он там не нужен и его наличие как раз и является потенциальным источником leak.

А у тебя судя по всему компилятор не вставляет InitializeRecord в конструктор записи. Какой у тебя Build?


 
Kolan ©   (2007-10-11 09:53) [16]

Delphi из BDS: Borland® Delphi® for Microsoft® Windows™ Version 10.0.2151.25345
Delphi 2007: CodeGear™ Delphi® for Microsoft® Windows™ Version 11.0.2627.5503

Где смотреть апдэёты незнаю&#133


 
oxffff ©   (2007-10-11 10:17) [17]

Одно радует. Баг был, но они его уже исправили.



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

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

Наверх




Память: 0.53 MB
Время: 0.017 c
2-1191845204
xayam
2007-10-08 16:06
2007.11.11
Производительность


2-1192506624
dmdel
2007-10-16 07:50
2007.11.11
Закрасить пиксель


11-1176527771
MTsv DN
2007-04-14 09:16
2007.11.11
Замечания и предложения (KOLnMCK v.2.57)


2-1192729777
periskops
2007-10-18 21:49
2007.11.11
Определение прав пользователя


15-1190964025
Azize
2007-09-28 11:20
2007.11.11
Почему начальник всегда плохой?