2012-05-19 10 views
42

हर इतनी बार मेरे ऐप दुर्घटना होगा और मेरी लॉग पढ़ा जाएगा:अमान्य ढेर पते और घातक संकेत 11

@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree 
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 

कभी कभी code=2, लेकिन हमेशा Fatal signal 11 और invalid heap address

मैंने शोध करने का प्रयास किया है कि इसका क्या अर्थ है और इसे कैसे ठीक किया जाए। This thread has been the most helpful; हालांकि, मैं अभी भी समाधान के बिना हूँ।

त्रुटि तब होती है जब मैं कई छवियों को डाउनलोड करने के लिए AsyncTasks चलाता हूं।

यह मेरा मुख्य AsyncTask

public class FetchArtistImages extends AsyncTask<Void, Integer, String[]> implements Constants { 

private final WeakReference<Context> contextReference; 

public FetchArtistImages(Context context) { 
    contextReference = new WeakReference<Context>(context); 
} 

@Override 
protected String[] doInBackground(Void... params) { 
    String[] projection = new String[] { 
      Audio.Artists._ID, Audio.Artists.ARTIST 
    }; 
    String sortOrder = Audio.Artists.DEFAULT_SORT_ORDER; 
    Uri uri = Audio.Artists.EXTERNAL_CONTENT_URI; 
    Cursor c = contextReference.get().getContentResolver() 
      .query(uri, projection, null, null, sortOrder); 
    ArrayList<String> artistIds = new ArrayList<String>(); 
    if (c != null) { 
     int count = c.getCount(); 
     if (count > 0) { 
      final int ARTIST_IDX = c.getColumnIndex(Audio.Artists.ARTIST); 
      for (int i = 0; i < count; i++) { 
       c.moveToPosition(i); 
       artistIds.add(c.getString(ARTIST_IDX)); 
      } 
     } 
     c.close(); 
     c = null; 
    } 
    return artistIds.toArray(new String[artistIds.size()]); 
} 

@Override 
protected void onPostExecute(String[] result) { 
    for (int i = 0; i < result.length; i++) { 
      new LastfmGetArtistImages(contextReference.get()).executeOnExecutor(
        AsyncTask.THREAD_POOL_EXECUTOR, result[i]); 
    } 
    super.onPostExecute(result); 
} 

हालांकि मैं शोध क्या इस के साथ हो रहा है की कोशिश की है, मैं अभी भी जब यह तय करने की बात आती है अपने आप को खो दिया लगता है। अगर किसी के पास कुछ अंतर्दृष्टि है, तो मैं निश्चित रूप से इसे देखकर सराहना करता हूं। त्रुटि हर बार जब मैं execute मेरा AsyncTasks नहीं फेंकती है, लेकिन मुझे ऐसा होने के कारण अलग-अलग पैटर्न नहीं मिल पा रहे हैं। एसओ पर fatal signal 11 पर कुछ अन्य धागे हैं, लेकिन वे मेरे मामले में बहुत मदद नहीं करते हैं।

+0

क्या आपके आवेदन में कोई जेएनआई है? –

+0

नहीं, ऐसा नहीं है। – adneal

+0

मेरे पास मेरे आवेदन में जेएनआई है और मुझे यह त्रुटि मिल रही है। कोई सुझाव, @ जुलिएनऑस्टिन –

उत्तर

43

मैं बस एक ही मुद्दे में भाग गया और इसे पुन: उत्पादित राज्य में था। ए/libc (4233):

08-04 17: 37: ०५.४९१ @@@ निरस्त: 37:: ०५.४९१ dlfree 08-04 17 में अमान्य ढेर पता इस त्रुटि मैं हो रही थी है: ए/libc (4233): घातक संकेत 11 (SIGSEGV) 0xdeadbaad पर (कोड = 1)

क्या यह करने के लिए नीचे उबला हुआ एक समारोह कॉल एक ही समय में दो अलग-अलग धागे से बनाया जा रहा है है।

अधिक विशेष रूप से, यह फ़ंक्शन ब्लूटूथ सॉकेट की नज़दीकी() विधि थी।

मैंने स्रोत कोड at this website को चेक किया है, और कॉल सिंक्रनाइज़ नहीं है (यह सुनिश्चित नहीं है कि यह एंड्रॉइड 2.1 से है या नहीं)।

किसी भी दर पर, क्या आपके पास ऐसा ही परिदृश्य हो सकता है जहां एकाधिक थ्रेड से फ़ंक्शन कॉल किया जाता है? आप जो स्रोत कोड दिखा रहे हैं उससे निश्चित रूप से नहीं कह सकते हैं।

क्या आपने THREAD_POOL_EXECUTOR का उपयोग नहीं करने का प्रयास किया है? the android dev guide के अनुसार:

जब पहली बार पेश किया गया, AsyncTasks को एक पृष्ठभूमि थ्रेड पर क्रमशः निष्पादित किया गया था। डोनट से शुरू होने पर, यह थ्रेड के पूल में बदल दिया गया था जिससे कई कार्यों को समानांतर में संचालित किया जा सकता था। HONEYCOMB से शुरू होने पर, समानांतर निष्पादन के कारण सामान्य अनुप्रयोग त्रुटियों से बचने के लिए कार्यों को एकल थ्रेड पर निष्पादित किया जाता है।

+0

आपने यह कैसे पता लगाया कि आपकी समस्याएं ब्लूटूथ सॉकेट की करीबी() विधि थीं? – bonifaz

+0

मैंने कोड की जांच की और ध्यान दिया कि मैं लगभग एक ही समय में दो अलग-अलग धागे से करीबी() विधि को बुला रहा था। – Ivan

+0

यह उत्तर बिल्कुल सही है। मेरे पास एक ही त्रुटि कोड था (@@@ ABORTING: LIBC: तर्क dlfree addr में INAPALID HEAP पता है)। मेरे विशेष मामले में मेरे पास दो अलग-अलग थ्रेड थे जिन्हें PathMeasure.getPosTan विधि कहते हैं। मेरे कोड को बदलने के बाद यह सुनिश्चित करने के लिए कि इसे एक समय में केवल एक थ्रेड द्वारा बुलाया जाएगा, त्रुटि दूर चली गई। – Luis

8

मुझे कल भी यही त्रुटि थी। यह हमेशा हुआ लेकिन हमेशा लगातार नहीं। मेरे लिए अब तक इसका क्या कारण नहीं है।

मैंने सोचा कि मुझे एक समान समस्या हो सकती है क्योंकि मैं भी थ्रेड से निपट रहा था, हालांकि मैंने अपने सभी थ्रेडिंग को हटा दिया और समस्या अभी भी हो रही थी। अंत में प्रिंट स्टेटमेंट्स के गुच्छा के बाद मैं इसे उस कक्षा में ट्रैक करने में सक्षम था जिसे मैंने इंस्टाल किया था जिसमें एक निजी सदस्य के रूप में एक सूचक था, लेकिन मैं सूचक को प्रारंभ करना भूल गया।

बाद में जब उस वर्ग को नष्ट कर दिया गया तो यह सूचक को हटाने की कोशिश कर रहा था, हालांकि पॉइंटर को न्यूल में प्रारंभ नहीं किया गया था, यह कुछ कचरा मूल्य हो सकता है या नहीं, इसलिए कभी-कभी यह किसी दुर्घटना का कारण नहीं बनता है और अन्य बार । ऐसा शायद इसलिए है क्योंकि जब कचरा मूल्य एक स्मृति स्थान था जो मेरे नहीं है या जब यह करता है और मैं कुछ महत्वपूर्ण हटा देता हूं, तो यह क्रैश/त्रुटि का कारण बनता है।

यहाँ समस्या मैं का सामना करना पड़ा के एक उदाहरण के नीचे छीन लिया है:

class BadFoo 
{ 
public: 
    BadFoo() {} // BAD! We didn't initialize the pointer 
    ~BadFoo() { 
     if (myPtr) { 
      delete myPtr; 
     } 
    } 
    // OTHER MEMBER FUNCTIONS HERE 

private: 
    int* myPtr; 
} 

class GoodFoo 
{ 
public: 
    GoodFoo() : myPtr(NULL) {} // GOOD! Can't be garbage value now 
    ~GoodFoo() { 
     if (myPtr) { 
      delete myPtr; 
     } 
    } 
    // OTHER MEMBER FUNCTIONS HERE 

private: 
    int* myPtr; 
} 

नोट करने के लिए दिलचस्प है, इस दुर्घटना मेरी ट्रांसफार्मर प्रधानमंत्री नहीं होती, लेकिन मेरे Nexus4 पर किया था। बस दिखाने के लिए चला जाता है कि हमें कई उपकरणों पर परीक्षण करना चाहिए! अब तक नेक्सस मुझे बग्स को ट्रैक करने में मदद करने के लिए जीतता है क्योंकि यह बहुत पसंदगार लगता है।

+0

डाउनवोट क्यों? मैं यह देखने में असफल रहा कि क्यों सुनिश्चितकर्ता पॉइंटर्स प्रारंभ कर रहे हैं एक बुरी चीज है, खासकर जब यह प्रश्न में त्रुटि का कारण बनती है। – PolyMesh

+0

आपके उत्तर ने मेरी समस्या का हल किया। धन्यवाद – user65721

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