2012-04-16 8 views
9

में दिखाया गया है कुछ सी ++ एप्लिकेशन ओएस एक्स हिम तेंदुए में संकलित और चलाए गए हैं, लेकिन मैंने हाल ही में ओएस एक्स शेर में बदल दिया है, और यहां, हालांकि कोई संकलन त्रुटि नहीं है, जब मैं कोशिश करता हूं इसे चलाने के लिए मुझे त्रुटि मिलती है "अवैध निर्देश: 4", मेरे पास कोई सुराग नहीं है, कारण क्या हो सकता है?"अवैध निर्देश: 4" ओएस एक्स शेर

पुनश्च:

ये जोड़ने झंडे मैं

-Wl,-stack_size,0x10000000,-stack_addr,0xc0000000 

का उपयोग कर रहे हैं यह आउटपुट मैं जब मैं sudo truss executable

setrlimit returned result = -1 
    SYSCALL(args)  = return 
getpid(0x0, 0x0, 0x0)  = 32993 0 
__sysctl(0xBFFFF5EC, 0x3, 0xBFFFF5E8)  = 0 0 
issetugid(0xBFFFF5EC, 0x3, 0xBFFFF5E8)  = 0 0 
csops(0x0, 0x0, 0xBFFFF65C)  = 0 0 
shared_region_check_np(0xBFFFD5E0, 0x0, 0xBFFFF65C)  = 0 0 
stat64("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0xBFFFE830, 0xBFFFF65C)   = 0 0 
open("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x0, 0x0)   = 3 0 
pread(0x3, "\312\376\272\276\0", 0x1000, 0x0)  = 4096 0 
pread(0x3, "\316\372\355\376\a\0", 0x1000, 0x6000)  = 4096 0 
mmap(0x4D3000, 0x2000, 0x1, 0x12, 0x3, 0x3)  = 0x4D3000 0 
mmap(0x4D5000, 0x1000, 0x3, 0x12, 0x3, 0x3)  = 0x4D5000 0 
mmap(0x4D6000, 0x1EF0, 0x1, 0x12, 0x3, 0x3)  = 0x4D6000 0 
close(0x3)  = 0 0 
stat64("/usr/lib/libstdc++.6.dylib\0", 0xBFFFE690, 0x1)  = 0 0 
stat64("/usr/lib/libgcc_s.1.dylib\0", 0xBFFFE690, 0x1)  = 0 0 
stat64("/usr/lib/libSystem.B.dylib\0", 0xBFFFE560, 0x1)  = 0 0 
stat64("/usr/lib/libc++abi.dylib\0", 0xBFFFE5D0, 0x1)  = 0 0 
stat64("/usr/lib/system/libcache.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libcommonCrypto.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libcompiler_rt.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libcopyfile.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libdispatch.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libdnsinfo.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libdyld.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libkeymgr.dylib\0", 0xBFFFE360, 0x1)   = 0 0 
stat64("/usr/lib/system/liblaunch.dylib\0", 0xBFFFE360, 0x1)   = 0 0 
stat64("/usr/lib/system/libmacho.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libmathCommon.A.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libquarantine.dylib\0", 0xBFFFE360, 0x1)   = 0 0 
stat64("/usr/lib/system/libremovefile.dylib\0", 0xBFFFE360, 0x1)   = 0 0 
stat64("/usr/lib/system/libsystem_blocks.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libsystem_c.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libsystem_dnssd.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libsystem_info.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libsystem_kernel.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libsystem_network.dylib\0", 0xBFFFE360, 0x1)   = 0 0 
stat64("/usr/lib/system/libsystem_notify.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libsystem_sandbox.dylib\0", 0xBFFFE360, 0x1)   = 0 0 
stat64("/usr/lib/system/libunc.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
stat64("/usr/lib/system/libunwind.dylib\0", 0xBFFFE360, 0x1)   = 0 0 
stat64("/usr/lib/system/libxpc.dylib\0", 0xBFFFE360, 0x1)  = 0 0 
open("/dev/dtracehelper\0", 0x2, 0xBFFFF5B0)   = 3 0 
ioctl(0x3, 0x80086804, 0xBFFFF540)  = 0 0 
close(0x3)  = 0 0 
__sysctl(0xBFFFF1FC, 0x2, 0xBFFFF1F4)  = 0 0 
bsdthread_register(0x92C9F6BC, 0x92C9F6E0, 0x1000)  = 0 0 
thread_selfid(0x92C9F6BC, 0x92C9F6E0, 0x1000)  = 2500945 0 
mmap(0x0, 0x2000, 0x3, 0x1002, 0x1000000, 0xAC308375)  = 0x4D8000 0 
mprotect(0x4D8000, 0x44, 0x1)  = 0 0 
mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x4D8034)  = 0x4DA000 0 
mprotect(0x4DA000, 0x1000, 0x0)  = 0 0 
mprotect(0x4E6000, 0x1000, 0x0)  = 0 0 
mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x4DB000)  = 0x4E7000 0 
mprotect(0x4E7000, 0x1000, 0x0)  = 0 0 
mprotect(0x4F3000, 0x1000, 0x0)  = 0 0 
mmap(0x0, 0x1000, 0x3, 0x1002, 0x1000000, 0x4E8000)  = 0x4F4000 0 
mprotect(0x4F4000, 0x1000, 0x1)  = 0 0 
mprotect(0x4D8000, 0x44, 0x3)  = 0 0 
mmap(0x0, 0x200000, 0x3, 0x1002, 0x7000000, 0x4F4000)  = 0x4F5000 0 
munmap(0x4F5000, 0xB000)   = 0 0 
munmap(0x600000, 0xF5000)  = 0 0 
mprotect(0x4D8000, 0x44, 0x1)  = 0 0 
getpid(0x4D8000, 0x44, 0x1)  = 32993 0 
__mac_syscall(0x973E8E8E, 0x2, 0xBFFFF0C8)  = 0 0 
stat64("/AppleInternal\0", 0xBFFFF130, 0xBFFFF0C8)  = -1 Err#2 
audit_session_self(0x92C1F4B6, 0xBFFFF130, 0xBFFFF0C8)  = 5635 0 
geteuid(0x92C1F4B6, 0xBFFFF130, 0xBFFFF0C8)  = 0 0 
getegid(0x92C1F4B6, 0xBFFFF130, 0xBFFFF0C8)  = 0 0 
getaudit_addr(0xBFFFF0A8, 0x30, 0xBFFFF0C8)  = 0 0 
csops(0x80E1, 0x7, 0xBFFFECF8)  = 0 0 
mmap(0x0, 0x2000, 0x3, 0x1002, 0x1000000, 0xACA5EB00)  = 0x4F5000 0 
mprotect(0x4F5000, 0x44, 0x1)  = 0 0 
mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x4F5034)  = 0x600000 0 
mprotect(0x600000, 0x1000, 0x0)  = 0 0 
mprotect(0x60C000, 0x1000, 0x0)  = 0 0 
mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x601000)  = 0x60D000 0 
mprotect(0x60D000, 0x1000, 0x0)  = 0 0 
mprotect(0x619000, 0x1000, 0x0)  = 0 0 
mprotect(0x4F4000, 0x1000, 0x3)  = 0 0 
mprotect(0x4F4000, 0x1000, 0x1)  = 0 0 
mprotect(0x4F5000, 0x44, 0x3)  = 0 0 
mmap(0x0, 0x200000, 0x3, 0x1002, 0x7000000, 0x4F4004)  = 0x61A000 0 
munmap(0x61A000, 0xE6000)  = 0 0 
munmap(0x800000, 0x1A000)  = 0 0 
mprotect(0x4F5000, 0x44, 0x1)  = 0 0 
getrlimit(0x1003, 0xBFFFF8DC, 0x1)  = 0 0 
setrlimit(0x1003, 0xBFFFF8DC, 0x1)  = -1 Err#22 
getrlimit(0x1008, 0xBF835C60, 0x1)  = 0 0 
fstat64(0x1, 0xBF836090, 0x1F)  = 0 0 
mmap(0x0, 0x1000000, 0x3, 0x1002, 0x2000000, 0xACA5B3E0)   = 0x800000 0 
munmap(0x1000000, 0x800000)  = 0 0 

PS2 करना है: यदि मैं हटाने पहले से जोड़ने उल्लेख झंडा, प्रोग्राम बिना किसी त्रुटि के चलाता है। लेकिन जब मैं इनपुट वास्तविक डेटा कार्यक्रम के लिए, तो मैं

Segmentation fault: 11 

मिल मुझे याद है कि इस कार्यक्रम के ढेर के साथ एक समस्या थी, तो यह वृद्धि हुई किया जाना था। लिनक्स में मैं इस किया था और काम करता है

 const rlim_t kStackSize = 256L * 1024L * 1024L; // min stack size = 64 Mb 
    struct rlimit rl; 
    int result; 

    result = getrlimit(RLIMIT_STACK, &rl); 
    if (result == 0) 
    { 
      if (rl.rlim_cur < kStackSize) 
      { 
        rl.rlim_cur = kStackSize; 
        result = setrlimit(RLIMIT_STACK, &rl); 
        if (result != 0) 
        { 
          fprintf(stderr, "setrlimit returned result = %d\n", result); 
        } 
      } 
    } 

लेकिन ओएस एक्स में, के बाद से है कि काम नहीं किया, मैं पहले ध्वज को जोड़ने का उल्लेख किया करता था, और कोई समस्या नहीं OS X Snow Leopard है, इसलिए ऐसा लगता है कि मैं अभी भी है ओएस एक्स शेर में ढेर ओवरफ्लो समस्या लेकिन लिंकिंग ध्वज इसे हल नहीं करता है। मैं क्या कर सकता था?

+0

यह लाइन 'सेट्रलिमिट (0x1003, 0xBFFFF8DC, 0x1) = -1 त्रुटि # 22' ट्रस/ड्रेसेस में दिखाती है कि सेट्रलिमिट कॉल' EINVAL' 'के साथ असफल रहा है "अवैध तर्क" (22/usr/include/sys/errno.h)। असफल fprintf (...) त्रुटि संदेश आउटपुट के शीर्ष पर प्रदर्शित होता है, लेकिन चूंकि fprintf के बाद कोई 'निकास (1) 'नहीं है, इसलिए प्रोग्राम स्टैक आकार के साथ जारी रहता है। –

+0

एक लापता वापसी मूल्य "अवैध निर्देश: 4" का कारण बन सकता है। मैं कल इस में भाग गया। मेरे कंपाइलर चेतावनियों पर ध्यान देना मुझे सही रास्ते पर लाया। – rsp1984

उत्तर

19

में मिलेगा, मुझे माउंटेन शेर (10.8,) पर उत्पाद बनाने और फिर शेर पर चलने पर इस समस्या का सामना करना पड़ा। (10.7)। कारण यह था कि मैंने अपने निर्माण वातावरण में कुछ बदलाव किए।

(मैं mkbundle उपयोग कर रहा हूँ एक उत्पाद मोनो का उपयोग करता है जहाज के लिए।)

फिक्स बहुत आसान था, मुझे क्लैंग को बताना था कि उत्पन्न बाइनरी को ओएसएक्स 10.6 पर काम करने की आवश्यकता है।

-mmacosx-version-min=10.6 

समस्या हल: मैं बजना के लिए निम्न तर्क जोड़ा गया!

+0

मैकोज़ सिएरा 10.12.6 पर एक ही समस्या थी - निम प्रोग्रामिंग भाषा कंपाइलर और टूल्स बनाने के लिए क्लैंग का उपयोग करने की कोशिश कर रहा था। कॉन्फ़िगरेशन में इसे जोड़ने से समस्या ठीक हो गई - धन्यवाद! – user208769

0

यह एक permissions issue.

हो सकता है आगे का निदान करने के लिए, sudo dtruss उपसर्ग के साथ टर्मिनल से अपने कार्यक्रम चलाते हैं। देखें कि त्रुटि को फेंकने से पहले यह किस syccall चलाता है।

उदाहरण: sudo dtruss /path/to/application

तुम भी Xcode या GDB डिबगर के साथ का निदान कर सकते हैं।

+0

मैंने ऐसा किया लेकिन मुझे बहुत सारी स्मृति संबंधी जानकारी मिलती है जिसे मैं समझ नहीं पा रहा हूं। बाद में, संकलन विकल्पों को देखते हुए मैं अब देखता हूं कि त्रुटि शायद स्टैक आकार की वृद्धि के कारण है। लेकिन बर्फ तेंदुए में मुझे कभी भी यह समस्या नहीं मिली। – flow

+0

शेर 32-बिट अनुप्रयोगों के लिए एएसएलआर और ढेर मेमोरी सुरक्षा जोड़ता है ... मुझे कोई अन्य स्मृति-संबंधित परिवर्तन नहीं दिखता है। – lunixbochs

8

ओएस एक्स शेर (लेकिन 10.5) में स्टैक आकार हार्ड सीमा 65532 केबीटी (केवल 64 एमआईबी के तहत) है।

bswift$ ulimit -Hs 
65532 

भी रूट के रूप में, मैं इस मूल्य में वृद्धि नहीं कर सकता: इस के साथ देखा जा सकता है। केवल 8 MiB को

नरम सीमा चूक:

bswift$ ulimit -Ss unlimited 
bswift$ ulimit -Ss 
65532 

नोट:: segmentation fault (SIGSEGV) (संख्या 11) आप मनाया है

bswift$ ulimit -Ss 
8192 

आप आवेदन शुरू करने से पहले इस अधिकतम करने के लिए मूल्य बढ़ाने का प्रयास करें सिग्नल सीमा man setrlimit

के अनुसार स्टैक सीमा पार हो गई है नोट:के बाद से 10 कमांड को शेल बिल्टिन होना जरूरी है, आपको इसे man bash