Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизОчередной баг. Утечка памяти Найти похожие ветки
← →
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
Выходит нет??? Или что-то не так…
> Хотя проще поставить бряк сразу на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.createUnit1.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
Где смотреть апдэёты незнаю…
← →
oxffff © (2007-10-11 10:17) [17]Одно радует. Баг был, но они его уже исправили.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.061 c