2012-04-16 8 views
9

Alguna aplicación C++ compilada y ejecutada sin problemas en OS X Snow Leopard, pero cambié recientemente a OS X Lion, y aquí, aunque no hay ningún error de compilación, cuando intento para ejecutarlo me sale el error "Instrucción ilegal: 4", no tengo ni idea, ¿cuál podría ser el motivo?"Instrucción no válida: 4" aparece en OS X Lion

PS:

Estas son las banderas que unen utilizo

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

Ésta es la salida que tengo cuando hago 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: Si quito el ya mencionado que une bandera, el programa se ejecuta, sin error. Pero cuando los datos reales que de entrada al programa, cuando me siento

Segmentation fault: 11 

que recordar que este programa tenía un problema con la pila, por lo que tuvo que ser aumentado. En Linux me hizo esto y trabaja

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

pero en OS X, ya que eso no funcionó, he usado el anteriormente mencionado que une bandera, y no tenía es OS X Snow Leopard problema, por lo que parece que todavía tengo la problema de desbordamiento de pila en OS X Lion, pero el indicador de vinculación no resuelve esto. ¿Qué puedo hacer?

+0

Esta línea 'setrlimit (0x1003, 0xBFFFF8DC, 0x1) = -1 Err # 22' en el truss/dtrace muestra que la llamada de límite de seguridad está fallando con' EINVAL' "argumento inválido" (22 buscó en/usr/include/sys/errno.h). El mensaje de error fprintf (...) fallido se muestra en la parte superior de la salida, pero como no hay 'exit (1)' después de fprintf, el programa continúa sin modificar el tamaño de la pila. –

+0

Un valor de devolución faltante puede causar una "Instrucción ilegal: 4". Me encontré con esto ayer. Prestar atención a las advertencias de mi compilador me puso en el camino correcto. – rsp1984

Respuesta

19

Encontré este problema al construir un producto en Mountain Lion (10.8) y luego ejecutar Lion. (10.7). La causa fue que hice algunos cambios en mi entorno de compilación.

(Estoy utilizando mkbundle para enviar un producto que utiliza Mono.)

La solución fue muy simple, tuve que decir clang que los binarios generados deben funcionar en OSX 10.6. Agregué el siguiente argumento para clang:

-mmacosx-version-min=10.6 

¡Problema resuelto!

+0

Tuve el mismo problema en MacOS Sierra 10.12.6 - tratando de usar clang para compilar el compilador y las herramientas del lenguaje de programación nim. Agregar esto a la configuración solucionó el problema, ¡gracias! – user208769

0

Esto podría ser un permissions issue.

para diagnosticar, ejecutar el programa desde el terminal con sudo dtruss prefijado. Vea qué syscall se ejecuta antes de lanzar el error.

Ejemplo: sudo dtruss /path/to/application

También puede diagnosticar con los depuradores Xcode o GDB.

+0

Lo hice pero obtengo mucha información relacionada con la memoria que no puedo entender. Más tarde, mirando las opciones de compilación, ahora veo que el error probablemente se deba al incremento del tamaño de la pila. Pero en leopardo de las nieves nunca tuve este problema. – flow

+0

Lion agrega protección ASLR y memoria de montón a aplicaciones de 32 bits ... No veo ningún otro cambio relacionado con la memoria. – lunixbochs

8

En OS X Lion (pero también 10.5) el límite de tamaño de pila es de 65532 kbytes (poco menos de 64 MiB). Esto se puede ver con:

bswift$ ulimit -Hs 
65532 

Incluso como root, no podría aumentar este valor.

el límite por defecto suaves a sólo el 8 MiB:

bswift$ ulimit -Ss 
8192 

intenta elevar el valor de este máximo antes de comenzar la aplicación:

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

Nota: segmentation fault (SIGSEGV) (número 11) que ha observado es la señal enviada al proceso cuando se excede el límite de la pila según man setrlimit

Nota: Desde elEl comando 10 necesita ser un shell incorporado, lo encontrará documentado en man bash