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?
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. –
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