Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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


Выходит нет??? Или что-то не так&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.061 c
15-1192012226
Dennis I. Komarov
2007-10-10 14:30
2007.11.11
2 x ADSL


6-1173444998
vlavich
2007-03-09 15:56
2007.11.11
Проблема с установкой RAS соединения


15-1191838594
homm
2007-10-08 14:16
2007.11.11
Нужен драйвер прямого доступа к COM порту


2-1192884365
user1024
2007-10-20 16:46
2007.11.11
Как записать значение типа Memo в таблицу БД?


4-1178440852
buben
2007-05-06 12:40
2007.11.11
Как скрыть форму чужого приложения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский