Tüm Platformlar için Hızlı Uygulama Geliştirme Kitap Yayın Süreci
Kitap gözden geçirilmek üzere BTG (Bilgi ve Teknoloji Grubu) 'na gönderildi. 05.10.2018-14:10
BTG (Bilgi ve Teknoloji Grubu) tarafından iki sayfalık bir reklam tasarımı bekleniyor. 08.10.2018 - 15:30
Kitap basım talebi değerlendirilmek üzere matbaaya bildirildi. Matbaadan basım süreci hakkında bilgi bekleniyor. 15.10.2018 - 15:34
Kitap 1.000 adet basım talebi ile matbaaya gönderildi. 16.10.2018 - 16:50

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TClientDataset Memory Leak
#1
Merhaba,

TClientDataset'den türeterek bir component geliştirmeye çalışıyorum ve bir memory leak ile karşılaştım ve çözemedim. Neyseki soru sormak için kaynak kodun tamamını paylaşmak yerine sorunu reproduce edebilecek bir kod geliştirdim.

Aşağıdaki kodu çalıştırıp uygulamamayı kapatırken (reportmemoryleaksonshutdonw ise) memory leak hatası veriyor. FastMM ile hatayı dosyaya logladım, ilgili kısım da aşağıdaki gibidir. 

Sorunun olduğu yerde bir assembly kod var ama sebebini açıkçası çözemedim. Yardımlarınız memnuniyetle karşılanacaktır  Big Grin

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.Close;

  ClientDataSet1.Tag := 1;
  ClientDataSet1.Open;
  //ClientDataSet1.AppendRecord(['General']);
end;

procedure TForm1.ClientDataSet1BeforeOpen(DataSet: TDataSet);
begin
  if ClientDataSet1.Tag = 1 then
  begin
     ClientDataSet1.Tag := 0;
     ClientDataSet1.Fields.Clear;
     ClientDataSet1.FieldDefs.Clear;
     ClientDataSet1.FieldDefs.Add('Collection', ftString, 50);
     ClientDataSet1.FieldDefs.Find('Collection').CreateField(ClientDataSet1);
     ClientDataSet1.CreateDataSet;
  end;
end;

--------------------------------2017/6/19 12:00:21--------------------------------
A memory block has been leaked. The size is: 68

This block was allocated by thread 0x4FA8, and the stack trace (return addresses) at the time was:
418CD6 [FastMM4.pas][FastMM4][DebugAllocMem$qqri][9900]
407276 [System.pas][System][AllocMem$qqri][4557]
65F91B [Datasnap.DBClient.pas][Datasnap.DBClient][Dbclient.TCustomClientDataSet.AllocKeyBuffers$qqrv][3965]
6598AE [Datasnap.DBClient.pas][Datasnap.DBClient][Dbclient.TCustomClientDataSet.InternalOpen$qqrv][1514]
623BC8 [Data.DB.pas][Data.DB][Db.TDataSet.DoInternalOpen$qqrv][12527]
623C77 [Data.DB.pas][Data.DB][Db.TDataSet.OpenCursor$qqro][12556]
65885B [Datasnap.DBClient.pas][Datasnap.DBClient][Dbclient.TCustomClientDataSet.OpenCursor$qqro][1282]
623B2F [Data.DB.pas][Data.DB][Db.TDataSet.SetActive$qqro][12508]
62396B [Data.DB.pas][Data.DB][Db.TDataSet.Open$qqrv][12464]
65BE16 [Datasnap.DBClient.pas][Datasnap.DBClient][Dbclient.TCustomClientDataSet.CreateDataSet$qqrv][2342]
706827 [Unit1.pas][Unit1][TForm1.ClientDataSet1BeforeOpen$qqrp16Data.Db.TDataSet][64]

The block is currently used for an object of class: Unknown

The allocation number is: 1092

Current memory dump of 256 bytes starting at pointer address 7EF776F0:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F1 7F B4 7C
80 80 80 80 80 80 80 80 00 00 00 00 C1 70 F7 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
73 04 00 00 D6 8C 41 00 76 72 40 00 1B F9 65 00 AE 98 65 00 C8 3B 62 00 77 3C 62 00 5B 88 65 00
2F 3B 62 00 6B 39 62 00 F4 65 70 00 D5 A7 53 00 A8 4F 00 00 A8 4F 00 00 AA 72 40 00 BE F5 60 00
AF F9 65 00 FA 9A 65 00 B8 3C 62 00 06 8C 65 00 9C 3B 62 00 F7 31 62 00 3C 8B 41 00 51 8B 41 00
29 7A 65 00 3C 00 00 00 00 00 00 00 69 F3 D9 86 E4 FB 71 00 80 80 80 80 80 80 80 80 80 80 80 80
80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  ñ    ´  |
€  €  €  €  €  €  €  €  .  .  .  .  Á  p  ÷  ~  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
s  .  .  .  Ö  Œ  A  .  v  r  @  .  .  ù  e  .  ®  ˜  e  .  È  ;  b  .  w  <  b  .  [  ˆ  e  .
/  ;  b  .  k  9  b  .  ô  e  p  .  Õ  §  S  .  ¨  O  .  .  ¨  O  .  .  ª  r  @  .  ¾  õ  `  .
¯  ù  e  .  ú  š  e  .  ¸  <  b  .  .  Œ  e  .  œ  ;  b  .  ÷  1  b  .  <  ‹  A  .  Q  ‹  A  .
)  z  e  .  <  .  .  .  .  .  .  .  i  ó  Ù  †  ä  û  q  .  €  €  €  €  €  €  €  €  €  €  €  €
€  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €
Cevapla
#2
Teknik olarak önce DataSet oluşturup sonra Open yapılmalı. Yani önce CreateDataSet'i çağırmalısınız.

TClientDataset'in kaynak kodları incelenip problemin kaynağı net olarak bulunabilir.
Vaktim elverdiği ölçüde hızlıca baktığımda; CreateDataSet içerisinde zaten Open'ın çağrıldığı görülüyor. Yani sadece CreateDataSet kullanmak yeterli.
There's no place like 127.0.0.1
WWW
Cevapla
#3
Evet Open metodunu reintroduce edip, kodları oraya taşıdım ve Open içersinde inherited'a gitmeden işlemlerimi yaptım. ReportMemoryLeaksOnShutdown şu anda hata vermiyor fakat FastMM yine hata veriyor ama benim kodumla ilişkilendiremedim FastMM'in verdiği hatayı.

   

--------------------------------2017/6/19 17:37:23--------------------------------
A memory block has been leaked. The size is: 20

This block was allocated by thread 0x49C4, and the stack trace (return addresses) at the time was:
4DB29E54 
4DB28419 
4DB21AA9 
4DB1A52D 
4DB1A537 
4DB24059 
77A209AE [Unknown function at RtlpNtEnumerateSubKey]
77A21958 [Unknown function at RtlpNtEnumerateSubKey]
77A2193C [Unknown function at RtlpNtEnumerateSubKey]
77A2193C [Unknown function at RtlpNtEnumerateSubKey]
779DA863 [Unknown function at RtlUlonglongByteSwap]

The block is currently used for an object of class: Unknown

The allocation number is: 58991

Current memory dump of 256 bytes starting at pointer address 7E8DDCB0:
E4 8B C6 00 80 80 80 80 50 75 B4 7E 80 80 80 80 73 A1 D5 54 80 80 80 80 00 00 00 00 70 72 8D 7E
00 00 00 00 00 00 00 00 78 9D 41 00 00 00 00 00 7A E6 00 00 54 9E B2 4D 19 84 B2 4D A9 1A B2 4D
9F 71 B1 4D 2D A5 B1 4D 37 A5 B1 4D 53 4D B2 4D AE 09 A2 77 58 19 A2 77 3C 19 A2 77 3C 19 A2 77
C4 49 00 00 C4 49 00 00 A5 85 40 00 F9 8D 40 00 89 D3 73 00 27 87 40 00 DC CF 73 00 27 87 40 00
48 E1 73 00 27 87 40 00 28 F4 73 00 F9 8D 40 00 27 87 40 00 10 00 00 00 90 75 73 00 DC 3C 3E 81
E4 8B C6 00 80 80 80 80 50 75 B4 7E 80 80 80 80 23 C3 C1 7E 80 80 80 80 00 00 00 00 11 D9 8D 7E
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7F E6 00 00 54 9E B2 4D 19 84 B2 4D A9 1A B2 4D
D8 03 98 77 FD 19 B2 4D 7C 32 AF 4D 1E 31 AF 4D 2C 5C 14 77 FC 0C 14 77 96 8E 41 00 A5 8E 41 00
ä  ‹  Æ  .  €  €  €  €  P  u  ´  ~  €  €  €  €  s  ¡  Õ  T  €  €  €  €  .  .  .  .  p  r    ~
.  .  .  .  .  .  .  .  x    A  .  .  .  .  .  z  æ  .  .  T  ž  ²  M  .  „  ²  M  ©  .  ²  M
Ÿ  q  ±  M  -  ¥  ±  M  7  ¥  ±  M  S  M  ²  M  ®  .  ¢  w  X  .  ¢  w  <  .  ¢  w  <  .  ¢  w
Ä  I  .  .  Ä  I  .  .  ¥  …  @  .  ù    @  .  ‰  Ó  s  .  '  ‡  @  .  Ü  Ï  s  .  '  ‡  @  .
H  á  s  .  '  ‡  @  .  (  ô  s  .  ù    @  .  '  ‡  @  .  .  .  .  .    u  s  .  Ü  <  >  
ä  ‹  Æ  .  €  €  €  €  P  u  ´  ~  €  €  €  €  #  Ã  Á  ~  €  €  €  €  .  .  .  .  .  Ù    ~
.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .    æ  .  .  T  ž  ²  M  .  „  ²  M  ©  .  ²  M
Ø  .  ˜  w  ı  .  ²  M  |  2  ¯  M  .  1  ¯  M  ,  \  .  w  ü  .  .  w  –  Ž  A  .  ¥  Ž  A  .
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  exe memory osiso 1 453 08-11-2017, Saat: 16:58
Son Yorum: Tuğrul HELVACI
  Dataset Out Of Memory Hatası? delphi-x 2 501 02-11-2017, Saat: 00:16
Son Yorum: delphi-x
  TNotification Memory Leak yhackup 12 1.295 01-07-2017, Saat: 11:48
Son Yorum: Fesih ARSLAN
  Memory Leak Sorunu yhackup 24 2.170 12-05-2017, Saat: 15:31
Son Yorum: masteryoda



Konuyu Okuyanlar: 1 Ziyaretçi