2010-03-09 8 views
5

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

नीचे दिए गए नमूने में, मैं स्ट्रिंग, सूची या वेक्टर लाइनों को असम्बद्ध करके समस्या को पुन: उत्पन्न कर सकता हूं। उन्हें छोड़कर आवेदन पूरा होने के लिए आवेदन में टिप्पणी की टिप्पणी की। मुझे उम्मीद है कि कुछ ढेर को दूषित कर रहा है, लेकिन मैं नहीं देख सकता क्या? विभाजन खंडन देने से पहले कुछ सेकंड के लिए कार्यक्रम चलाएगा।

कोड एक हाथ-linux पार संकलक का उपयोग कर संकलित किया गया है:

arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread 
arm-linux-strip test 

कोई भी विचार बहुत सराहना।

#include <stdio.h> 
#include <vector> 
#include <list> 
#include <string> 

using namespace std; 
///////////////////////////////////////////////////////////////////////////// 

class TestSeg 
{ 
static pthread_mutex_t  _logLock; 

public: 
    TestSeg() 
    { 
    } 

    ~TestSeg() 
    { 
    } 

    static void* TestThread(void *arg) 
    { 
    int i = 0; 
    while (i++ < 10000) 
    { 
    printf("%d\n", i); 
    WriteBad("Function"); 
    } 
    pthread_exit(NULL); 
    } 

    static void WriteBad(const char* sFunction) 
    { 
    pthread_mutex_lock(&_logLock); 

    printf("%s\n", sFunction); 
    //string sKiller;  //  <----------------------------------Bad 
    //list<char> killer; //  <----------------------------------Bad 
    //vector<char> killer; //  <----------------------------------Bad 

    pthread_mutex_unlock(&_logLock); 
    return; 
    } 

    void RunTest() 
    { 
    int threads = 100; 
    pthread_t  _rx_thread[threads]; 
    for (int i = 0 ; i < threads ; i++) 
    { 
    pthread_create(&_rx_thread[i], NULL, TestThread, NULL); 
    } 

    for (int i = 0 ; i < threads ; i++) 
    { 
    pthread_join(_rx_thread[i], NULL); 
    } 
    } 

}; 

pthread_mutex_t  TestSeg::_logLock = PTHREAD_MUTEX_INITIALIZER; 


int main(int argc, char *argv[]) 
{ 
TestSeg seg; 
seg.RunTest(); 
pthread_exit(NULL); 
} 
+0

आप एसटीडी जाँच कर ली है :: स्ट्रिंग मंच पर pthreads बिना काम करता है? –

+1

और कोशिश की, 100 के बजाय 2 धागे? – indiv

+1

हां, बहुत सारे धागे seg गलती का एक संभावित कारण है। –

उत्तर

5

शायद आप मानक पुस्तकालय के एकल-थ्रेडेड संस्करण का उपयोग कर रहे हैं, जिसमें new और delete ऑपरेटर शामिल हैं?

उन वस्तुओं का निर्माण आपके म्यूटेक्स के गार्ड के भीतर किया जा रहा है, लेकिन उन सीमाओं के बाहर नष्ट हो गए हैं, इसलिए विनाशक एक दूसरे पर कदम उठा सकते हैं। एक त्वरित परीक्षण killer की घोषणा के आसपास स्कॉइंग ब्रैकेट {} डालना होगा।

अधिक के लिए the gcc documentation देखें।

+0

सलाह मार्क के लिए धन्यवाद। मैंने स्कोपिंग ब्रैकेट के साथ प्रयास किया है, और समस्या दूर हो गई है।क्या यह म्यूटेक्स गार्ड के अंदर वस्तुओं को घोषित करने का अनुशंसित तरीका है, या मैंने कुछ मौलिक रूप से गलत किया है? "arm-linux-g ++ -v" को कॉल करते समय यह केवल संस्करण उत्पन्न करता है, और --enable-threads को बिल्कुल सूचीबद्ध नहीं करता है। क्या इसका मतलब है कि मैं एकल थ्रेडेड संस्करण का उपयोग कर रहा हूं? क्योंकि मेरे पास क्रॉस-कंपाइलर को बदलने का विकल्प नहीं है (प्रदाता केवल इसका समर्थन करता है), मेरा सबसे अच्छा तरीका क्या है? – Brad

+0

"arm-linux-g ++ -v" उपज क्या संस्करण करता है? '-v' विकल्प को पास करने से केवल मेरे जीसीसी 2.95.2 आर्म क्रॉस-कंपाइलर के साथ संस्करण संख्या मुद्रित होती है, लेकिन '-v' विकल्प' gen 3.4.5 आर्म क्रॉस-कंपाइलर के साथ' -enable-threads = posix' सूचीबद्ध करता है । – jschmier

+0

हाय jschmier, क्षमा करें मैं कुछ समय के लिए परियोजना से दूर गया हूं और अब इस मुद्दे को देख रहा हूं। अपने आप की तरह, pass -v केवल संस्करण संख्या मुद्रित करता है। दुर्भाग्य से मैं जीसीसी 2.95.2 आर्म क्रॉस-कंपाइलर का उपयोग करने के लिए प्रतिबंधित हूं क्योंकि यह सभी आपूर्तिकर्ता उनके एम्बेडेड प्लेटफार्म के साथ समर्थन करता है। क्या आपके पास अपने क्रॉस कंपाइलर के साथ एक ही समस्या है? आपने इसके आसपास कैसे काम किया? धन्यवाद – Brad

0

आप कहते हैं कि क्या PTHREAD_MUTEX_INITIALIZER है, लेकिन आप TestSeg पर :: _ logLock pthread_mutex_init बुला रहे हैं? यह संभव है यदि आप एक अनियमित म्यूटेक्स का उपयोग कर रहे हैं जो उन रचनाकारों से ढेर और/या ढेर संचालन आपके म्यूटेक्स में हस्तक्षेप कर रहे हैं।

+0

'PTHREAD_MUTEX_INITIALIZER' 'pthread_mutex_init (3)' को कॉल किए बिना POSIX mutex को स्थिर रूप से प्रारंभ करने का मानक तरीका है। –

0

क्या आपने कोशिश की है -ओएस और -00? आपका आर्म-लिनक्स-जी ++ - वर्जन क्या है?

0

एम्बेडेड आर्म लिनक्स प्लेटफ़ॉर्म के लिए सेगमेंटेशन दोषों को विकसित और डिबग करने पर, मैं अक्सर SIGSEGV सिग्नल हैंडलर से स्टैक backtrace प्रिंट करने के लिए कोड जोड़ता हूं। शायद मैं here का उपयोग करने वाले कार्यान्वयन का कुछ उपयोग कर सकता हूं।

मैं निम्नलिखित जीसीसी/जी ++ विकल्प (दूसरों के बीच) के साथ निर्माण:

arm-linux-g++ -Wall -pipe -rdynamic -fno-omit-frame-pointer test.cpp -o test 
संबंधित मुद्दे