2010-04-06 9 views
23

बदलने के कारण मुझे याद आ रही है कि मुझे स्मृति भ्रष्टाचार की समस्या है। कई घंटों के बाद डिबगिंग और कोशिश करने के बाद मुझे लगता है कि मुझे कुछ मिला है।सिस्टम में मेमोरी भ्रष्टाचार। 8087 सीडब्ल्यू मोड (पीएनजी + स्ट्रेचब्लैट)

उदाहरण के लिए: मैं एक साधारण स्ट्रिंग काम करते हैं:

sTest := 'SET LOCK_TIMEOUT '; 

हालांकि, कभी-कभी परिणाम हो जाता है:

sTest = 'SET LOCK'#0'TIMEOUT ' 

तो, _ द्वारा एक 0 बाइट की जगह हो जाता है।

मैंने सिस्टम में यह एक बार हो रहा है (पुन: उत्पादित करना मुश्किल है, समय पर निर्भर है)। मेव फ़ंक्शन, जब यह तेज़ मेमोरी प्रतिलिपि के लिए एफपीयू स्टैक (फिल्ड, फिस्ट) का उपयोग करता है (9 से 32 बाइट्स तक ले जाने के):

... 
@@SmallMove: {9..32 Byte Move} 
fild qword ptr [eax+ecx] {Load Last 8} 
fild qword ptr [eax] {Load First 8} 
cmp  ecx, 8 
jle  @@Small16 
fild qword ptr [eax+8] {Load Second 8} 
cmp  ecx, 16 
jle  @@Small24 
fild qword ptr [eax+16] {Load Third 8} 
fistp qword ptr [edx+16] {Save Third 8} 
... 

एफपीयू देख सकते हैं और 2 स्मृति डिबग दृश्य (डेल्फी का उपयोग करना -> देखें -> डीबग -> सीपीयू -> मेमोरी) मैं यह जा रहा गलत ... एक बार ... लेकिन पुन: पेश नहीं कर सका देखा ...

आज सुबह मैंने 8087 सीडब्ल्यू मोड के बारे में कुछ पढ़ा, और हाँ, अगर यह $ 27FI में बदल गया है तो स्मृति भ्रष्टाचार प्राप्त करें! आम तौर पर यह $ 133F है:

$ 133F और $ 027F के बीच अंतर यह है कि $ 027F (कम सटीक गणना कर (विस्तारित की जगह में डबल करने के लिए सीमित) और विभिन्न इनफिनिटी से निपटने के लिए एफपीयू सेट जो इस्तेमाल किया गया था है पुराने एफपीयू के लिए, लेकिन अब और उपयोग नहीं किया जाता है)।

ठीक है, अब मैंने पाया क्यों नहीं बल्कि जब!

if Get8087CW = $27F then //normally $1372? 
    if MainThreadID = GetCurrentThreadId then //only check mainthread 
    DebugBreak; 

मैं "प्रोफाइल" कुछ इकाइयों और dll के और बिंगो (ढेर देखें)::

मैं एक साधारण जांच (ताकि सभी कार्यों में प्रवेश करने और छोड़ने के पर जाँच कर रहे हैं) के साथ मेरी AsmProfiler की कार्यप्रणाली बदल

Windows.StretchBlt(3372289943,0,0,514,345,4211154027,0,0,514,345,13369376) 
pngimage.TPNGObject.DrawPartialTrans(4211154027,(0, 0, 514, 345, (0, 0), (514, 345))) 
pngimage.TPNGObject.Draw($7FF62450,(0, 0, 514, 345, (0, 0), (514, 345))) 
Graphics.TCanvas.StretchDraw((0, 0, 514, 345, (0, 0), (514, 345)),$7FECF3D0) 
ExtCtrls.TImage.Paint 
Controls.TGraphicControl.WMPaint((15, 4211154027, 0, 0)) 

तो यह StretchBlt में हो रहा है ...

अब क्या करें? क्या यह विंडोज़ की गलती है, या पीएनजी में एक बग है (डी 2007 में शामिल)? या सिस्टम है। मेव फ़ंक्शन विफल नहीं है?

नोट: बस पुन: पेश करने की कोशिश कर काम नहीं करता है:

Set8087CW($27F); 
    sSQL := 'SET LOCK_TIMEOUT '; 

यह अधिक विदेशी प्रतीत हो रहा है ... लेकिन 'Get8087CW = $ 27F' पर DebugBreak से मैं इसे एक अन्य स्ट्रिंग पर पुन: पेश कर सकता : एफपीयू भाग 1: FPU part 1 एफपीयू भाग 2: FPU part 2 एफपीयू भाग 3: FPU part 3 एफपीयू अंतिम: भ्रष्ट !: FPU Final: corrupt!

नोट 2: शायद सिस्टम में एफपीयू स्टैक को मंजूरी दे दी जानी चाहिए।

+0

+1। मुझे जवाब नहीं पता, लेकिन मेरी समस्या निवारण रणनीति हमेशा संभावनाओं को खत्म कर समस्या को सरल बनाना है। देखें कि क्या आप पीएनजी को नए lib के साथ हटाकर या बदलकर पीएनजी पर या बाहर कर सकते हैं। –

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/1466229/what-can-cause-system-move-to-occasionaly-give-wrong-results – mghie

उत्तर

8

मैं इस विशेष मुद्दा नहीं देखा है, लेकिन निश्चित रूप से ले जाएँ में गड़बड़ कर सकते हैं, तो एफपीयू एक बुरी स्थिति में है। सिस्को के वीपीएन चालक चीजों को बहुत खराब कर सकते हैं, भले ही आप नेटवर्क से संबंधित कुछ भी नहीं कर रहे हों।

http://brianorr.blogspot.com/2006/11/intel-pentium-d-floating-point-unit.html

http://www.dankohn.com/archives/343

http://blog.excastle.com/2007/08/28/delphi-bug-of-the-day-fpu-stack-leak/ (रिची Annand द्वारा टिप्पणियाँ)

हमारे मामले में हम गाड़ी वीपीएन चालक का पता लगाने और डेल्फी 7 संस्करणों के साथ ले जाएँ और FillChar बाहर स्वैप, एक साथ IntToStr की जगह पास्कल संस्करण (इंट 64-संस्करण एफपीयू का उपयोग करता है), और, चूंकि हम फास्टएमएम का उपयोग कर रहे हैं, इसलिए हम इसकी कस्टम फिक्स्ड साइज मूव रूटीन भी अक्षम करते हैं, क्योंकि वे सिस्टम से भी ज्यादा संवेदनशील हैं।

+0

धन्यवाद, मैं पहले से ही सोच रहा था कि इस तरह की और स्थितियां हो सकती हैं या नहीं , तो हाँ ... :-( लेकिन यह मुझे सामान्य रूप से एफपीयू के बारे में बुरी भावनाएं देता है: यदि आपके पास बहुत महत्वपूर्ण वैज्ञानिक या व्यावसायिक गणना है, तो आप 100% सुनिश्चित कर सकते हैं कि परिणाम सही हैं? मेरा मतलब है: यदि आप निष्पादित करते हैं या बाहरी फ़ंक्शन का उपयोग करें, आपके पास अतिरिक्त जोखिम है। अब यह पीएनजी या वीडियोकार्ड है जो एफपीयू को दूषित कर सकता है, लेकिन सिस्को या ऑडियो ड्राइवर भी ऐसा कर सकता है ... –

+0

@ एंड्रे वर्तमान मामलों के साथ उचित रूप से एकमात्र तरीका है आश्वस्त करें कि वे एक सादे विंडोज इंस्टॉलेशन (कोई तृतीय पक्ष ड्राइवर), और केवल आपके सॉफ़्टवेयर का उपयोग करके सही हैं। –

3

यह आपके वीडियो ड्राइवर में एक बग हो सकता है जो 8087 नियंत्रण शब्द को संरक्षित नहीं करता है जब यह StretchBlt ऑपरेशन करता है।
अतीत में मैंने कुछ प्रिंटर ड्राइवरों का उपयोग करते समय समान व्यवहार देखा है। उन्हें लगता है कि वे 8087 सीडब्ल्यू के मालिक हैं और गलत हैं ...

नोट डेल्फी में 8087 सीडब्ल्यू का डिफ़ॉल्ट मान $ 1372 लगता है; सीडब्ल्यू मूल्यों के बारे में अधिक विस्तृत स्पष्टीकरण के लिए, this article देखें: यह एक ऐसी स्थिति भी बताता है जिसे माइकल जस्टिन ने वर्णित किया था जब उसका 8087 सीडब्ल्यू हो गया था।

--jeroen

2

बस अपनी जानकारी के लिए (यदि किसी और के पास भी एक ही समस्या है): हमने ग्राहक के लिए हमारे सॉफ़्टवेयर का अपग्रेड किया है, और हमारे एप्लिकेशन को शुरू होने पर पूरी टचस्क्रीन लॉक हो गई है! विंडोज पूरी तरह से जमे हुए थे! पीसी को पुनरारंभ करना था (बिजली बंद)। पूर्ण फ्रीज के कारण को समझने में कुछ समय लगा।

सौभाग्य से हमारे पास FastMove.LargeSSEMove में एक एवी का केवल (केवल 1!) स्टैकट्रैक था। मैंने फास्टमोव में एसएसई के उपयोग को अक्षम कर दिया, और समस्या खत्म हो गई।

वैसे: टचस्क्रीन में एक एस 3 चिपसेट के साथ एक वीआईए नहेम्याह सीपीयू है।

इसलिए एफपीयू का उपयोग करते समय आप केवल स्मृति भ्रष्टाचार नहीं कर सकते हैं, बल्कि एक पूर्ण फ्रीज भी! अनुसंधान पर अच्छी नौकरी के लिए

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