2012-08-28 13 views
15

मैं पहले से लिखे गए कुछ मैटलैब कोड को वेक्टरराइज कर रहा हूं, और इस प्रक्रिया के दौरान मैटलैब सेगमेंटेशन दोषों के कारण क्रैश हो रहा था। मैंने समस्या को एक प्रकार की गणना में संकुचित कर दिया: एकाधिक संरचना गुणों को असाइन करना।वेक्टर असाइनमेंट को पुन: सक्रिय करते समय मैटलैब सेगमेंटेशन गलती

उदाहरण के लिए, इस रूप का भी स्वयं काम अंततः एक SEG गलती जब कई हजार गुना निष्पादित कारण बनता है:

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;

मैंने शुरू में माना कि यह किसी प्रकार की स्मृति रिसाव होनी चाहिए, इसलिए हर पुनरावृत्ति के बाद जावा की मुफ्त मेमोरी को प्रिंट करने का प्रयास किया, लेकिन यह काफी स्थिर रहा।

तो, हाँ, पूरी तरह से एक नुकसान में अब क्यों यह टूट जाता है के रूप में: -/

अद्यतन: निम्न परिवर्तन SEG दोषयुक्त ठीक करता है:

अस्थायी = [my_class_instance.my_struct_vector];

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

सवाल यह है कि यह कुछ भी ठीक क्यों करेगा। संरचना सूची की बजाय शायद हैंडल क्लास तक पहुंचने के बारे में कुछ?

अद्यतन 2: भूखंड

गाढ़ा मैं अंत में समस्या और एक डमी कार्यक्रम काफी सरल यहाँ पोस्ट करने के लिए का उपयोग कर के आसपास काम दोहराया गया है:

एक साधारण वर्ग:

classdef test_class 
    properties 
     test_prop 
    end 
end 

और एक प्रोग्राम जो कक्षा के साथ वेक्टर असाइनमेंट का एक गुच्छा बनाता है, और हमेशा क्रैश होगा।

test_instance = test_class(); 
test_instance.test_prop = struct('test_field',{1 1}); 
for i=1:10000 

    [test_instance.test_prop.test_field] = test_instance.test_prop.test_field; 
end 

अद्यतन 3: भूखंड thins

बाहर कर देता है मुझे एक बग मिला। Matlab तकनीकी समर्थन के अनुसार, वर्ग गुणों के बार-बार वेक्टर असाइनमेंट R2011a (और संभवतः पहले संस्करण में) में काम नहीं करेगा। उसने मुझे बताया कि यह R2012a में ठीक काम करता है, और उसके बाद मैंने खोजे गए वही कामकाज का उल्लेख किया: एक अस्थायी चर का उपयोग करें।

तो, हाँ ...

यकीन है कि इस सवाल का कि समर्थन टिकट के साथ समाप्त होता है, लेकिन किसी भी साहसी व्यक्तियों को क्यों इस बग बिल्कुल मौजूद है के रूप में एक शॉट लेने के लिए चाहते हैं, तो मैं निश्चित रूप से अभी भी होगा इस तरह के एक जवाब में रुचि रखते हैं। (सीखना मजेदार है!)

+0

आपका मैटलैब संस्करण क्या है? जीत के लिए –

+0

R2011a 7 64 बिट – zergylord

+0

आपकी मदद नहीं कर सकता ... मेरे पास लिनक्स 64 बिट पर R2010b है, और यह ठीक काम करता है। क्या आपको मेमोरी डंप या समान मिलता है? –

उत्तर

3

अब तक का सबसे संभावित कारण यह है कि ऑपरेशन आंतरिक रूप से स्वयं-संशोधित कोड का उपयोग कर रहा है।इसके साथ समस्या यह है कि आधुनिक प्रोसेसर में सीपीयू कैश होते हैं, इसलिए यदि आप मेमोरी में कोड बदलते हैं, लेकिन कोड पहले से ही कैश के लिए प्रतिबद्ध है, तो यह एक सीजी गलती उत्पन्न करेगा।

कारण यह यादृच्छिक कारण है क्योंकि यह संशोधित करता है कि संशोधन और अन्य कारकों के दौरान संशोधित कोड कैश में है या नहीं।

इससे बचने के लिए प्रोग्रामर को स्वयं-संशोधन करने से पहले कोड को कैश फ्लश करना सुनिश्चित करना होगा।

+0

आपने प्रोग्रामिंग ghouls के pantheon से एक और दर्शक सफलतापूर्वक हटा दिया है। धन्यवाद और बधाई! – zergylord

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