2012-04-16 21 views
9

Một số ứng dụng C++ được biên dịch và chạy liên tục trong OS X Snow Leopard, nhưng gần đây tôi đã thay đổi OS X Lion, và ở đây, mặc dù không có lỗi biên dịch để chạy nó tôi nhận được lỗi "Hướng dẫn bất hợp pháp: 4", tôi không có đầu mối, những gì có thể là lý do?"Hướng dẫn bất hợp pháp: 4" hiển thị trong OS X Lion

PS:

Đây là những lá cờ nối tôi sử dụng

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

Đây là sản phẩm tôi nhận được khi tôi làm 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: Nếu tôi loại bỏ trước đó đã đề cập liên kết cờ, chương trình chạy, không có lỗi. Nhưng khi tôi nhập dữ liệu thực vào chương trình, sau đó tôi nhận được

Segmentation fault: 11 

Tôi nhớ rằng chương trình này có vấn đề với ngăn xếp, vì vậy nó phải được tăng lên. Trong Linux Tôi đã làm điều này và các công trình

 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); 
        } 
      } 
    } 

nhưng trong OS X, vì đó không làm việc, tôi đã sử dụng trước đây đề cập liên kết cờ, và không có vấn đề là OS X Snow Leopard, vì vậy nó có vẻ như tôi vẫn có vấn đề tràn ngăn xếp trong OS X Lion nhưng cờ liên kết không giải quyết được vấn đề này. Tôi có thể làm gì?

+0

Dòng này 'setrlimit (0x1003, 0xBFFFF8DC, 0x1) = -1 Err # 22' trong truss/dtrace hiển thị cuộc gọi setrlimit bị lỗi với' EINVAL' "đối số không hợp lệ" (22 tra cứu trong/usr/include/sys/errno.h). Thông báo lỗi fprintf (...) không thành công được hiển thị ở đầu đầu ra, nhưng vì không có 'exit (1)' sau fprintf, chương trình tiếp tục với kích thước ngăn xếp chưa được sửa đổi. –

+0

Giá trị trả lại bị thiếu có thể gây ra "Hướng dẫn bất hợp pháp: 4". Tôi chạy vào ngày hôm qua. Chú ý đến cảnh báo trình biên dịch của tôi đã đưa tôi đi đúng hướng. – rsp1984

Trả lời

19

Tôi gặp sự cố này khi tạo sản phẩm trên Mountain Lion (10.8,) và sau đó chạy trên Lion. (10.7). Nguyên nhân là tôi đã thực hiện một số thay đổi đối với môi trường xây dựng của mình.

(Tôi đang sử dụng mkbundle để giao một sản phẩm sử dụng Mono.)

Khắc phục rất đơn giản, tôi phải nói với clang rằng các tệp nhị phân đã tạo cần phải hoạt động trên OSX 10.6. Tôi đã thêm đối số sau vào clang:

-mmacosx-version-min=10.6 

Sự cố được giải quyết!

+0

Đã có cùng một vấn đề trên MacOS Sierra 10.12.6 - cố gắng sử dụng tiếng kêu để xây dựng trình biên dịch ngôn ngữ lập trình nim và các công cụ. Việc thêm cấu hình này vào cấu hình đã khắc phục sự cố - cảm ơn! – user208769

0

Đây có thể là permissions issue.

Để chẩn đoán hơn nữa, chạy chương trình của bạn từ các thiết bị đầu cuối với sudo dtruss tiền tố. Xem syscall nó chạy trước khi ném lỗi.

Ví dụ: sudo dtruss /path/to/application

Bạn cũng có thể chẩn đoán nó với bộ dò lỗi Xcode hoặc GDB.

+0

Tôi đã làm điều đó nhưng tôi nhận được rất nhiều thông tin liên quan đến bộ nhớ mà tôi không thể hiểu được. Sau đó, nhìn vào các tùy chọn biên dịch, tôi thấy rằng lỗi có thể là do sự gia tăng kích thước ngăn xếp. Nhưng trong báo tuyết tôi chưa bao giờ gặp vấn đề này. – flow

+0

Lion không thêm ASLR và bảo vệ bộ nhớ heap vào các ứng dụng 32 bit ... Tôi không thấy bất kỳ thay đổi nào liên quan đến bộ nhớ khác. – lunixbochs

8

Trong OS X Lion (nhưng cũng 10.5) giới hạn kích thước ngăn xếp kích thước là 65532 kbytes (chỉ dưới 64 MiB). Điều này có thể được nhìn thấy với:

bswift$ ulimit -Hs 
65532 

Ngay cả khi root, tôi không thể tăng giá trị này.

Các giá trị mặc định giới hạn mềm để chỉ 8 MiB:

bswift$ ulimit -Ss 
8192 

Cố gắng nâng cao giá trị tối đa này trước khi bắt đầu bạn ứng dụng:

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

Lưu ý: segmentation fault (SIGSEGV) (số 11), bạn quan sát là tín hiệu được gửi đến quy trình khi vượt quá giới hạn ngăn xếp theo man setrlimit

Lưu ý: Vì ulimit lệnh cần phải được tạo sẵn trong trình bao, bạn sẽ thấy tài liệu được tạo trong man bash

Các vấn đề liên quan