2013-07-16 21 views
6

डेल्फी XE जोड़ने, विंडोज 7 64-बिटडेल्फी स्मृति रिसाव जब भाषा

आप एक खाली आवेदन करने के लिए भाषा समर्थन जोड़ने जब आप एक स्मृति रिसाव (FastMM4) प्राप्त होगा।

पुन: पेश करने के लिए:

  • बनाने नई VCL रूपों आवेदन
  • .dpr को संशोधित करने और जोड़ने ReportMemoryLeaksOnShutdown := True;
  • बिल्ड/आवेदन चलाने के लिए और अनुप्रयोग बंद -> कोई लीक अब
  • सूचना दी एक भाषा जोड़ें (परियोजना -> भाषाएं -> जोड़ें)
  • बिल्ड/फिर से चलाएं और एप्लिकेशन बंद करें -> मेमोरी रिसाव ??

FastMM4 पूर्ण डिबग मोड की रिपोर्ट:

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

अब अजीब हिस्सा करने के लिए: भाषा को हटा दें और फिर से चलाने के -> रिसाव रहता है!

मैं .dpr और .res फ़ाइलों को छोड़कर सभी प्रोजेक्ट संबंधित फ़ाइलों (.dproj, .dproj2007, .dsk और so ..) को हटाकर रिसाव को हटा सकता हूं।

क्या कोई मुझे बता सकता है कि क्या हो रहा है?

अद्यतन

विवरण लॉग से पतों का उपयोग, ऐसा लगता है मैं System.Pas में रिसाव पाया: PreferredLanguagesOverridePChar के लिए

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 कहा जाता है और भंडार स्मृति। मैंने FreeMem(PreferredLanguagesOverride) के लिए System.Pas स्कैन किया लेकिन यह एकमात्र घटना है!

UPDATE2

मैं कारण है कि डेल्फी कॉल पाया SetLocaleOverride दिनचर्या:

जब आप भाषा समर्थन जोड़ने के लिए, एक रजिस्ट्री कुंजी निष्पादन पूरा पथ के रूप में नाम और वर्तमान सिस्टम स्थान के साथ बनाई गई है मूल्य के रूप में: HKEY_CURRENT_USER \ Software \ Embarcadero \ Locales

इस कुंजी को हटाने से डेल्फी SetLocaleOverride दिनचर्या को कॉल करने से रोकती है।

प्रश्न:

  • कोई पुष्टि कर सकते हैं, तो इस समस्या में मौजूद बाद में डेल्फी संस्करणों?(या कोई अन्य मैं एक QC रिपोर्ट)

अद्यतन 3

वहाँ पहले से ही एक QC report (105136) है और यह XE3

से निर्धारित किया गया है

प्रश्न: किसी ने मुझे दिखा सकते हैं कि यह कैसे समझौता कर दिया गया है एक्सई 3 में?

+1

एक क्यूसी रिपोर्ट जमा करें, और RegisterExpectedMemoryLeak पर कॉल करें। –

+0

डेल्फी XE3, विंडोज 7 64-बिट में पुन: उत्पन्न नहीं कर सकता ... – TLama

+1

@ टलामा: धन्यवाद, जाहिर है यह आपके संस्करण में तय किया गया है :) – whosrdaddy

उत्तर

0

जैसा कि पहले से ही मेरे प्रश्न में बताया गया है, यह XE3 से तय है।

निम्न संस्करण वाले लोगों के लिए, आप System.pas को पैच कर सकते हैं।

procedure _Halt0 में SetLocaleOverride(''); जोड़े बस लाइन से पहले:

FinalizeUnits; 

यह स्मृति रिसाव से छुटकारा मिल जाएगा।

जानना अच्छा है: How to recompile System.pas

यदि आप System.pas को पुन: संकलित नहीं करना चाहते हैं, तो आप अनुभाग में SetLocaleOverride(''); पर कॉल कर सकते हैं।

संबंधित मुद्दे