2013-07-16 14 views
6

Delphi XE, Windows 7 64-bitwyciek pamięci Delphi podczas dodawania języka

Po dodaniu obsługi języka do pustej aplikacji otrzyma wyciek pamięci (FastMM4).

Jak odtworzyć:

  • utworzyć nowy VCL tworzy aplikację
  • modyfikować .dpr i dodać ReportMemoryLeaksOnShutdown := True;
  • Build/Uruchom aplikację i zamknąć aplikację -> nie ma wycieków zgłaszane
  • teraz dodaj język (Projekt -> Języki -> Dodaj)
  • Zbuduj/uruchom ponownie i zamknij aplikację -> wyciek pamięci?

FastMM4 pełny raport debug mode:

--------------------------------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". 

Teraz do zabawnej części: usunąć język i uruchomić ponownie -> pobyty wycieków!

Mogę usunąć wyciek, usuwając wszystkie pliki związane z projektem (.dproj, .dproj2007, .dsk itd.) Z wyjątkiem plików .dpr i .res.

Czy ktoś może mi wyjaśnić, co się dzieje?

UPDATE

Korzystanie adresy z dziennika szczegół, wydaje znalazłem przeciek w 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 nazywa i pamięć rezerw na PreferredLanguagesOverridePChar. Zeskanowałem System.Pas dla FreeMem(PreferredLanguagesOverride), ale jest to jedyne zdarzenie!

Update2

znalazłem powód dlaczego nazywa Delphi SetLocaleOverride rutyna:

podczas dodawania obsługi języka, klucz rejestru jest tworzony z nazwą co plik wykonywalny pełnej ścieżki i aktualną narodowych systemu jako wartość: HKEY_CURRENT_USER \ Software \ Embarcadero \ Locales

Usunięcie tego klucza zapobiega delphi wywoływania procedury SetLocaleOverride.

Pytanie:

  • ktoś może zweryfikować, czy ten problem występuje w nowszych wersjach Delphi?(Albo zrobię raport QC)

UPDATE 3

istnieje już QC report (105136) i została ona ustalona z XE3

Pytanie: Czy ktoś może mi pokazać, jak to zostało poprawione w XE3?

+1

Prześlij raport QC i wywołaj RegisterExpectedMemoryLeak. –

+0

Nie można odtworzyć w Delphi XE3, Windows 7 64-bit ... – TLama

+1

@ Tlama: dziękuję, najwyraźniej zostało to naprawione w Twojej wersji :) – whosrdaddy

Odpowiedz

0

Jak już wspomniano w moje pytanie, to jest ustalona z XE3.

Dla tych z niższymi wersjami, można załatać System.pas.

Dodaj SetLocaleOverride(''); w procedure _Halt0 tuż przed linią:

FinalizeUnits; 

To będzie pozbyć wycieku pamięci.

Warto wiedzieć: How to recompile System.pas.

Jeśli nie chcesz przekompilować System.pas, możesz zadzwonić pod numer SetLocaleOverride(''); w sekcji finalization.