2010-09-28 16 views
7

के साथ मेमोरी रिसाव मेरे आवेदन के साथ एक अजीब समस्या है, इसकी स्मृति उपयोग हर बार एक बार में कुछ सौ मेगाबाइट ऊपर जाती है और अंततः एप्लिकेशन फ्रीज हो जाती है। एप्लिकेशन डेल्फी के साथ लिखा गया है, यह डेटाबेस, COM (ओपीसी के लिए) और टीसीपी/आईपी का उपयोग करता है।डेल्फी/डीबीएक्सप्रेस

फास्टएमएम के साथ मुझे स्मृति उपयोग के स्क्रीन शॉट का पालन करना पड़ा है। मुझे पूरी तरह से यकीन नहीं है कि उस तालिका को कैसे पढ़ा जाए, लेकिन ऐसा लगता है कि कुछ ने 296463552 बाइट्स आवंटित किए हैं (0x100fb000, क्या वह "जादू संख्या" है?) तीन बार।

memory usage

कोई भी विचार? गैर-डेल्फी-एमएम मेमोरी आवंटन को ट्रैक करने का कोई तरीका है?

मैं फास्टएमएम 4.9 6 के साथ डेल्फी 2007 का उपयोग कर रहा हूं।

संपादित करें:

मैं कॉम स्मृति आवंटन को ट्रैक करने के IMallocSpy का उपयोग कर एक छोटा सा सहायक वर्ग लिखा था। यहां मुझे जो मिला है उससे उद्धरण दिया गया है:

00119023 5:52:27.484 [4496] TCOMAllocSpy.PreRealloc size: 269462304 
00119024 5:52:27.734 [4496] (0002760C){ntdll.dll } [7C82860C] KiFastSystemCallRet + $0 
00119025 5:52:27.734 [4496] (0009F83A){MyApp.exe} [004A083A] JclDebug.JclCreateThreadStackTrace (Line 3943, "JclDebug.pas" + 7) + $1E 
00119026 5:52:27.734 [4496] (003D496A){MyApp.exe} [007D596A] ComLeakHelper.TCOMAllocSpy.DebugStack (Line 46, "ComLeakHelper.pas" + 2) + $9 
00119027 5:52:27.734 [4496] (003D4B52){MyApp.exe} [007D5B52] ComLeakHelper.TCOMAllocSpy.PreRealloc (Line 125, "ComLeakHelper.pas" + 4) + $2 
00119028 5:52:27.734 [4496] (000053B6){MyApp.exe} [004063B6] [email protected] (Line 14090, "sys\system.pas" + 10) + $0 
00119029 5:52:27.734 [4496] (002E4490){MyApp.exe} [006E5490] DBXCommon.TDBXCommand.SetText (Line 5304, "..\..\..\..\..\src\pas\dbx\driver\DBXCommon.pas" + 13) + $5 
00119030 5:52:27.734 [4496] (0010A340){MyApp.exe} [0050B340] WideStrings.TWideStrings.GetValue (Line 580, "common\WideStrings.pas" + 3) + $D 
00119031 5:52:27.734 [4496] (002E1AFC){MyApp.exe} [006E2AFC] DBXCommon.TDBXProperties.GetValue (Line 4046, "..\..\..\..\..\src\pas\dbx\driver\DBXCommon.pas" + 1) + $7 
00119032 5:52:27.734 [4496] (002E3FC9){MyApp.exe} [006E4FC9] DBXCommon.TDBXConnectionEx.GetProductName (Line 5071, "..\..\..\..\..\src\pas\dbx\driver\DBXCommon.pas" + 1) + $E 
00119033 5:52:27.734 [4496] (003765FA){MyApp.exe} [007775FA] SqlExpr.TSQLConnection.DoConnect (Line 2467, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 66) + $21 
00119034 5:52:27.734 [4496] (0011876D){MyApp.exe} [0051976D] DB.TCustomConnection.SetConnected (Line 2628, "DB.pas" + 8) + $4 
00119035 5:52:27.734 [4496] (00118728){MyApp.exe} [00519728] DB.TCustomConnection.Open (Line 2611, "DB.pas" + 0) + $4 
00119036 5:52:27.734 [4496] (00375D6F){MyApp.exe} [00776D6F] SqlExpr.TSQLConnection.CheckConnection (Line 2302, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 4) + $2 
00119037 5:52:27.734 [4496] (00379241){MyApp.exe} [0077A241] SqlExpr.TCustomSQLDataSet.CheckConnection (Line 3955, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 2) + $2 
00119038 5:52:27.734 [4496] (0037968A){MyApp.exe} [0077A68A] SqlExpr.TCustomSQLDataSet.OpenCursor (Line 4045, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 3) + $4 
00119039 5:52:27.734 [4496] (00125EA9){MyApp.exe} [00526EA9] DB.TDataSet.SetActive (Line 9245, "DB.pas" + 12) + $7 
00119040 5:52:27.734 [4496] (00125CA1){MyApp.exe} [00526CA1] DB.TDataSet.Open (Line 9201, "DB.pas" + 1) + $6 
... 

तो, समस्या डेटाबेस कनेक्शन में प्रतीत होती है। मैं फायरबर्ड 2.1, डीबीएक्सप्रेस और इंटरएक्सप्रेस का उपयोग अप्ससीन से फायरबर्ड ड्राइवरों के लिए कर रहा हूं।

EDIT2: यह समान समस्या, कम से कम फोकस उसी तर्ज यहाँ के रूप में पर है विश्लेषण करने के लिए लगता है: http://www.yac.com.pl/mt.texts.sqlexpr-2.en.html

+0

आप कोशिश कर सकते हैं कि sysinternals से VMMap आपको अधिक जानकारी देता है लेकिन इसे ट्रैक करने का एक निश्चित तरीका procdump (sysinternals से) का उपयोग करना होगा। जब मेमोरी सीमा पार हो जाती है और WinDbg के साथ डंप का विश्लेषण करते हैं तो यह स्वचालित रूप से डंप फ़ाइल बनाते हैं। –

+0

वीएमएपी ने मूल रूप से एक ही जानकारी दी, आवंटित एक (या अधिक) बड़ा ब्लॉक है। यह रिसाव – Harriv

+0

फास्टएमएम 4.90 के स्रोत को खोजने में मदद नहीं करता है, जिसमें 'आवंटित लार्जब्लॉक' कार्यक्षमता है। मैं यहां एक बड़े पैमाने पर एक सशर्त ब्रेकपॉइंट लगाने की कोशिश करता हूं। –

उत्तर

2

समस्या डेल्फी 2007 डीबीईएक्सप्रेस में बग है जो बहुप्रचारित वातावरण में सतह है (यह सब थ्रेड सुरक्षित नहीं है)। यहां अधिक जानकारी: http://www.yac.com.pl/mt.texts.sqlexpr-2.en.html

1

आपका आवेदन जमा है, अपने ढेर को देखने के लिए कोशिश कर सकते हैं खोज करने के लिए कारण है कि यह जमे हुए है: http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer

आप सभी संसाधनों के आवंटन (और उनके स्टैकट्रेस) का पता लगाने के memproof कोशिश कर सकते हैं: http://www.torry.net/tools/debug/memory/memp0948.zip

+0

मैंने CoTaskMemAlloc (जो काम किया) के साथ समान स्मृति आवंटन बनाने की कोशिश की, लेकिन memproof उनको ट्रैक नहीं कर सकता है। – Harriv

0

का पता लगाने का प्रयास करें EurekaLog समस्या।

+0

एंड्रे को मेरी टिप्पणी देखें, वही यूरेकालॉग के साथ-साथ फास्टएमएम बिल्टिन लीक डिटेक्शन के लिए भी लागू होता है, क्योंकि मेमोरी आवंटन डेल्फी मेमोरी मैनेजर (= फास्टएमएम) के माध्यम से नहीं किया जाता है। – Harriv

+0

और हाँ, मैं यूरेकालॉग चला रहा हूं :) – Harriv

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

  • कोई संबंधित समस्या नहीं^_^