2013-07-16 27 views
6

Delphi XE, Windows 7 64-bitRò rỉ bộ nhớ Delphi khi thêm ngôn ngữ

Khi bạn thêm hỗ trợ ngôn ngữ vào ứng dụng trống, bạn sẽ nhận được rò rỉ bộ nhớ (FastMM4).

Làm thế nào để tái sản xuất:

  • tạo mới VCL tạo Application
  • thay đổi .dpr và thêm ReportMemoryLeaksOnShutdown := True;
  • xây dựng/Chạy ứng dụng và đóng ứng dụng -> không có rò rỉ thông báo
  • nay thêm ngôn ngữ (Dự án -> Ngôn ngữ -> Thêm)
  • Xây dựng/Chạy lại và đóng ứng dụng -> Bộ nhớ bị rò rỉ ??

FastMM4 đầy đủ debug mode báo cáo:

--------------------------------2013/7/16 14:54:34-------------------------------- 
A memory block has been leaked. The size is: 12 

This block was allocated by thread 0x17EC, and the stack trace (return addresses) at the time was: 
40455E 
40952D 
4094C8 
409834 
409941 
450058 
74548D76 [Unknown function at FirstHookFunc] 
7778FA1A [ZwOpenKey] 
75924033 [OpenRegKey] 
759240AE [OpenRegKey] 
777FA71A [Unknown function at RtlUlonglongByteSwap] 

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

The allocation number is: 6 

Current memory dump of 256 bytes starting at pointer address 7EF9A610: 
6E 00 6C 00 2D 00 42 00 45 00 00 00 41 58 0D 7A 00 00 00 00 C1 A6 F9 7E 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 2E 00 00 00 5E 45 40 00 DD 99 40 00 6D 71 4B 00 98 65 40 00 04 66 40 00 
77 A6 40 00 98 7C 4B 00 AA 33 8D 76 F2 9E 7A 77 C5 9E 7A 77 00 00 00 00 EC 17 00 00 EC 17 00 00 
1F 9A 40 00 53 7F 42 00 2C 65 40 00 EA 68 40 00 E3 7C 4B 00 AA 33 8D 76 F2 9E 7A 77 C5 9E 7A 77 
00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 B6 5C 27 4D 5C 12 4C 00 80 80 80 80 
49 A3 D8 B2 80 80 80 80 00 00 00 00 F9 B7 F9 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
65 00 00 00 5E 45 40 00 A7 50 40 00 22 56 40 00 DC 50 40 00 5F 72 4B 00 78 96 44 00 8E 72 4B 00 
98 65 40 00 04 66 40 00 77 A6 40 00 98 7C 4B 00 EC 17 00 00 EC 17 00 00 7A 45 40 00 C5 50 40 00 
n . l . - . B . E . . . A X . z . . . . Á ¦ ù ~ . . . . . . . . 
. . . . . . . . . . . .^E @ . Ý ™ @ . m q K . ˜ e @ . . f @ . 
w ¦ @ . ˜ | K . ª 3 v ò ž z w Å ž z w . . . . ì . . . ì . . . 
. š @ . S B . , e @ . ê h @ . ã | K . ª 3 v ò ž z w Å ž z w 
. . . . . . . . . . . . . . . . . . . . ¶ \ ' M \ . L . € € € € 
I £ Ø ² € € € € . . . . ù · ù ~ . . . . . . . . . . . . . . . . 
e . . .^E @ . § P @ . " V @ . Ü P @ . _ r K . x – D . Ž r K . 
˜ e @ . . f @ . w ¦ @ . ˜ | K . ì . . . ì . . . z E @ . Å P @ . 

--------------------------------2013/7/16 14:54:34-------------------------------- 
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer): 

5 - 12 bytes: Unknown x 1 

Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine "EnableMemoryLeakReporting". 

Bây giờ đến phần hài hước: loại bỏ các ngôn ngữ và chạy lại -> việc nghỉ rò rỉ!

Tôi có thể xóa rò rỉ bằng cách xóa tất cả các tệp liên quan đến dự án (.dproj, .dproj2007, .dsk, v.v ..) ngoại trừ tệp .dpr và .res.

Ai đó có thể giải thích cho tôi điều gì đang xảy ra không?

CẬP NHẬT

Sử dụng địa chỉ từ các bản ghi chi tiết, có vẻ như tôi thấy rò rỉ trong System.Pas:

var 
    PreferredLanguagesOverride: PChar = nil; 

...  
procedure SetLocaleOverride(const NewPreferredLanguages: string); 
var 
    L: Integer; 
begin 
    if PreferredLanguagesOverride <> nil then 
    FreeMem(PreferredLanguagesOverride); 
    L := Length(NewPreferredLanguages); 
    if L > 0 then 
    begin 
    Inc(L); 
    GetMem(PreferredLanguagesOverride, L * SizeOf(Char)); 
    MoveChars(NewPreferredLanguages[1], PreferredLanguagesOverride^, L); 
    end; 
end; 

SetLocaleOverride được gọi và nhớ dự trữ cho PreferredLanguagesOverridePChar. Tôi đã quét System.Pas cho FreeMem(PreferredLanguagesOverride) nhưng đây là lần xuất hiện duy nhất!

UPDATE2

tôi thấy lý do tại sao delphi gọi SetLocaleOverride thói quen:

khi bạn thêm hỗ trợ ngôn ngữ, một khóa registry được tạo ra với tên là đường dẫn đầy đủ thực thi và hệ thống locale hiện tại làm giá trị: HKEY_CURRENT_USER \ Software \ Embarcadero \ Locales

Xóa khóa này sẽ ngăn không cho delphi gọi quy trình SetLocaleOverride.

Câu hỏi:

  • ai đó có thể kiểm tra xem vấn đề này tồn tại trong các phiên bản sau Delphi?(Hoặc nếu không tôi thực hiện một báo cáo QC)

CẬP NHẬT 3

đã có một QC report (105136) và nó đã được cố định từ XE3

Câu hỏi: ai đó có thể chỉ cho tôi cách này đã được vá trong XE3?

+1

Gửi báo cáo QC và gọi RegisterExpectedMemoryLeak. –

+0

Không thể tái tạo trong Delphi XE3, Windows 7 64 bit ... – TLama

+1

@Tlama: cảm ơn, dường như nó đã được sửa trong phiên bản của bạn :) – whosrdaddy

Trả lời

0

Như đã nêu trong câu hỏi của tôi, điều này được cố định từ XE3.

Đối với những người có phiên bản thấp hơn, bạn có thể vá System.pas.

Thêm SetLocaleOverride(''); trong procedure _Halt0 ngay trước dòng:

FinalizeUnits; 

này sẽ thoát khỏi sự rò rỉ bộ nhớ.

Điều cần biết: How to recompile System.pas.

Nếu bạn không muốn biên dịch lại System.pas, bạn có thể gọi SetLocaleOverride(''); trong phần finalization.