2012-04-16 10 views
9

OS X Snow Leopardでシームレスにコンパイルされ実行されるC++アプリケーションがありますが、最近OS X Lionに変更されました。ここではコンパイルエラーはありませんが、それを実行するには、私はエラー "違法命令:4"を得る、私は何の手がかりがない、理由は何ができる?OS X Lionに「不正な命令:4」が表示される

PS:私は以前にリンク述べ削除する場合:

これらは、私はこれは私が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をするとき私が得る出力され

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

を使用するリンクフラグですフラグを立てると、エラーなしでプログラムが実行されます。しかし、ときに、プログラムへのI入力実数データは、その後、私はこのプログラムがスタックに問題があったので、それが増加しなければならなかったことを覚えておいてください

Segmentation fault: 11 

を取得します。 Linuxでは、私はこれをしなかったと

 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の 'setr​​limit(0x1003、0xBFFFF8DC、0x1)= -1 Err#22'は' EINVAL'で無効になっていることを示しています "無効な引数"(22は/ usr/sys/errno.h)。失敗したfprintf(...)エラーメッセージが出力の先頭に表示されますが、fprintfの後には 'exit(1)'が存在しないので、スタックサイズは変更されません。 –

+0

戻り値がないと、「不正命令:4」が発生することがあります。私は昨日これに遭遇した。私のコンパイラ警告に注意を払うことで、私は正しい軌道に乗った。 – rsp1984

答えて

19

Mountain Lion(10.8、)で製品をビルドしてからLionで実行するときにこの問題が発生しました。 (10.7)。原因はビルド環境にいくつかの変更を加えたことでした。

(私はMonoを使用する製品を出荷するために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

また、Xcodeのか、GDBデバッガでそれを診断することができます。

+0

私はそれをしましたが、私は理解できない多くの記憶に関連する情報を取得します。後で、コンパイルオプションを見てみると、おそらくスタックサイズの増加に起因すると考えられます。しかし、ヒョウヒョウで私はこの問題を抱えていません。 – flow

+0

Lionは32ビットアプリケーションにASLRとヒープメモリ保護を追加します...他のメモリ関連の変更はありません。 – lunixbochs

8

OS X Lion(ただし10.5)では、スタックサイズハードリミットは65532kバイト(64 MiB未満)です。 これはで見ることができます。

bswift$ ulimit -Hs 
65532 

でもrootとして、私は、この値を増やすことができませんでした。わずか8 MIBへ

ソフトリミットのデフォルト値:

bswift$ ulimit -Ss 
8192 

あなたのアプリケーションを起動する前に、この最大値を上げてみてください。

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

注:あなたが観察segmentation fault (SIGSEGV)(数11)であるがスタック限界を超えたときにプロセスに送信される信号man setrlimit

注:ulimitコマンドがシェルに組み込まれている必要がある場合は、man bash

関連する問題