2012-04-16 2 views
9

일부 C++ 응용 프로그램은 OS X Snow Leopard에서 원활하게 컴파일되고 실행되지만 최근에 OS X Lion으로 변경되었습니다. 여기서는 컴파일 오류가 없지만 시도 할 때 그것을 실행하려면 오류가 발생합니다 "잘못된 명령 : 4", 나는 아무런 단서가 없다, 이유는 무엇입니까?OS X Lion에 "잘못된 명령어 : 4"가 표시됩니다.

PS :

이 내가

-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를 수행 할 때이 내가 얻을 출력됩니다 내가 제거하면 이전에 연결 언급 플래그를 지정하면 프로그램이 실행되고 오류는 발생하지 않습니다. I 입력 실제 데이터가 프로그램에, 나는이

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에서

는, 내가 이전에 플래그를 연결하는 언급 사용 작동하고, 문제 OS X 스노우 레오파드 (Snow Leopard)입니다 없었다, 그래서 나는 여전히이 보인다 OS X Lion에서 스택 오버 플로우 문제가 있지만 링크 플래그로 문제가 해결되지 않습니다. 내가 뭘 할 수 있니?

+0

truss/dtrace의'setrlimit (0x1003, 0xBFFFF8DC, 0x1) = -1 Err # 22' 라인은 setrlimit 호출이'EINVAL'으로 실패한 것을 보여줍니다 "잘못된 인수"(22는/usr/include/sys/errno.h). 실패한 fprintf (...) 오류 메시지가 출력 맨 위에 표시되지만 fprintf 다음에 exit (1)이 없기 때문에 프로그램은 스택 크기를 수정하지 않고 계속됩니다. –

+0

반환 값이 누락되면 "잘못된 명령어 : 4"가 발생할 수 있습니다. 나는 어제 이것을 만났다. 내 컴파일러 경고에주의를 기울이면 올바른 방향으로 나를 인도했다. – rsp1984

답변

19

Mountain Lion (10.8,)에서 제품을 빌드 한 다음 Lion에서 실행할 때이 문제점이 발생했습니다. (10.7). 원인은 빌드 환경을 일부 변경했기 때문입니다.

(저는 모노를 사용하는 제품을 출시하기 위해 mkbundle을 사용하고 있습니다.)

수정 사항은 매우 간단했습니다. 생성 된 바이너리가 OSX 10.6에서 작동해야한다고 clang에게 알려야했습니다. 나는 clang에게 다음과 같은 주장을 덧붙였다 :

-mmacosx-version-min=10.6 

문제가 해결되었습니다!

+0

MacOS Sierra 10.12.6에서 동일한 문제가 발생했습니다. - clang을 사용하여 nim 프로그래밍 언어 컴파일러 및 도구를 작성하려고합니다. config에 이것을 추가하면 문제가 해결되었습니다 - 고마워요! – user208769

0

이 추가 진단 접두사 sudo dtruss와 터미널에서 프로그램을 실행하려면 permissions issue.

수 있습니다. 오류가 발생하기 전에 어떤 시스템 콜이 실행되는지 확인하십시오.

예 : sudo dtruss /path/to/application

당신은 또한 엑스 코드 또는 GDB 디버거로를 진단 할 수 있습니다.

+0

나는 그것을했다. 그러나 나는 이해할 수없는 많은 기억과 관련된 정보를 얻는다. 나중에 컴파일 옵션을 살펴보면 오류가 스택 크기의 증가로 인한 것임을 알게되었습니다. 하지만 스노우 레오파드에서는 이런 문제가 발생하지 않았습니다. – flow

+0

Lion은 32 비트 응용 프로그램에 ASLR 및 힙 메모리 보호를 추가합니다 ... 다른 메모리 관련 변경 사항은 표시되지 않습니다. – lunixbochs

8

OS X Lion (단 10.5)에서는 스택 크기 하드 제한이 65532KB (64MB 미만)입니다.

bswift$ ulimit -Hs 
65532 

심지어 루트로, 나는이 값을 증가시키지 수 : 이은으로 볼 수 있습니다. 단지 8 MiB 크기에

소프트 제한 기본값 :

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

참고 : 당신이 관찰 segmentation fault (SIGSEGV) (11 번)가있다

bswift$ ulimit -Ss 
8192 

당신에게 응용 프로그램을 시작하기 전에이 최대 값을 높여보십시오 스택 제한을 초과했을 때 프로세스에 전송 된 신호 man setrlimit

참고 : ulimit 명령은 쉘 내장이어야합니다. man bash

관련 문제