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 PreferredLanguagesOverride
PChar
. 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?
Gửi báo cáo QC và gọi RegisterExpectedMemoryLeak. –
Không thể tái tạo trong Delphi XE3, Windows 7 64 bit ... – TLama
@Tlama: cảm ơn, dường như nó đã được sửa trong phiên bản của bạn :) – whosrdaddy