“非法指令:4”出现在OS X Lion中 [英] "Illegal instruction: 4" shows up in OS X Lion

查看:267
本文介绍了“非法指令:4”出现在OS X Lion中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一些C ++应用程序可以在OS X Snow Leopard中无缝编译和运行,但是最近我更改为OS X Lion,尽管没有编译错误,但当我尝试运行它时,出现错误Illegal instruction:4 ,我不知道,可能是什么原因?



PS:

这些链接标志我使用

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

这是当我执行 sudo truss可执行文件时得到的输出

  setrlimit返回结果= -1 
SYSCALL(args)=返回
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 (0x4D6000,0x1EF0,0x1,0x12,0x3,0x3)= 0x4D3000 0
mmap(0x4D5000,0x1000,0x3,0x12,0x3,0x3)= 0x4D5000 0
mmap 0x4D6000 0
close(0x3)= 0 0
stat64(/ usr / lib / libstdc ++。6.dylib \ 0,0xBFFFE690,0x1)= 0 0
stat64(/ usr / lib / libSystem.B.dylib\0,0xBFFFE560,0x1)= 0 0
stat64(/ usr / lib / libSystem.B.dylib\0,0xBFFFE690,0x1)
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系统/ libco mpiler_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 /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_dnssd.dylib\0,0xBFFFE360(/ usr / lib / system / libsystem_c.dylib\0,0xBFFFE360,0x1)= 0 0
stat64 ,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) /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
cl ose(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(0x6190 (0x4F4000,0x44,0x3)= 0 0
mprotect(0x4F4000,0x1000,0x1)= 0 0
mprotect(0x4F4000,0x44,0x3)= 0 0
mprotect )= 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:如果我删除前面提到的链接标志,程序运行,没有错误。但是,当我输入真实数据到程序,然后我得到

 分段错误:11 

我记得这个程序在堆栈中有问题,所以必须增加它。在Linux中,我做到了这一点,并工作

  const rlim_t kStackSize = 256L * 1024L * 1024L; //最小堆栈大小= 64 Mb 
struct rlimit rl;
int结果;

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\\\
,result);
}
}
}

但是在OS X中,既然没有工作,我用前面提到的链接标志,并没有问题是OS X Snow Leopard,所以看起来我仍然在OS X Lion中存在堆栈溢出问题,但链接标志并没有解决这个问题。我能做什么?

解决方案

我在Lion Lion上创建产品时遇到了这个问题(10.8) 。 (10.7)。原因是我对构建环境做了一些修改。

(我使用mkbundle来发布一个使用Mono的产品。)



修复非常简单,我不得不告诉clang生成的二进制文件需要在OSX 10.6上运行。我为clang添加了以下参数:

  -mmacosx-version-min = 10.6 



问题解决了!


Some C++ application compiled and run seamlessly in OS X Snow Leopard, but I changed recently to OS X Lion, and here, although there is no compilation error, when I try to run it I get the error "Illegal instruction: 4", I have no clue, what could be the reason?

PS:

These are the linking flags I use

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

This is the output I get when I do 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: If I remove the previously mentioned linking flag, the program runs, with no error. But when I input real data to the program, then I get

Segmentation fault: 11

I remember that this program had a problem with the stack, so it had to be increased. In Linux I did this and works

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

but in OS X, since that did not work, I used the previously mentioned linking flag, and had no problem is OS X Snow Leopard, so it seems I still have the stack overflow problem in OS X Lion but the linking flag does not solve this. What could I do?

解决方案

I encountered this issue when building a product on Mountain Lion (10.8,) and then running on Lion. (10.7). The cause was that I made some changes to my build environment.

(I'm using mkbundle to ship a product that uses Mono.)

The fix was very simple, I had to tell clang that generated binaries need to work on OSX 10.6. I added the following argument to clang:

-mmacosx-version-min=10.6

Problem solved!

这篇关于“非法指令:4”出现在OS X Lion中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆