¿Cómo generar volcados centrales en Mac OS X?

Parece que no puedo generar volcados del núcleo en Mac OS X 10.6.8.

$ ulimit -c unlimited $ ./a.out Hello world! Segmentation fault $ find ~/ -type f -name core # ls -la /cores/ total 0 drwxrwxr-t@ 2 root admin 68 24 jui 2010 . drwxrwxr-t 31 root admin 1122 17 oct 15:52 .. 

Mi directorio actual, mi HOME y / cores / quedan vacíos …

Puede generar archivos de volcado de núcleo en Mac Os X de esta manera:

  1. Crea el archivo: /etc/launchd.conf , luego:

    echo "limit core unlimited" | sudo tee -a /etc/launchd.conf

  2. Reinicia tu Mac.

Y eso es todo, los archivos de volcado del núcleo se generan en el directorio /cores . Tenga cuidado de que los archivos de volcado del núcleo sean archivos grandes, de modo que cuando termine de solucionar el problema de su código, elimínelos.

De forma predeterminada, los lockings se informan en archivos .crash que se pueden encontrar en /Library/Logs/DiagnosticReports (en todo el sistema) y ~/Library/Logs/DiagnosticReports (user). Estos archivos se pueden abrir con la aplicación de la Consola , en Informes del usuario o del sistema . Los archivos .crash están en formato de texto plano y deben incluir información relevante sobre el locking.


Para activar los volcados de núcleo completo, asegúrese de que el directorio /cores tenga permisos de escritura para el usuario actual (test por: touch /cores/test && rm /cores/test ). Además, asegúrese de no tener ningún límite en el tamaño del archivo principal de la siguiente manera:

 ulimit -c unlimited 

El nombre del archivo de volcado del núcleo está en formato: core . PID .

Si el directorio está oculto, puede mostrar los archivos ocultos de la siguiente manera:

 defaults write com.apple.finder AppleShowAllFiles TRUE 

Puedes probarlo con los siguientes comandos:

 sleep 100 & killall -SIGSEGV sleep 

que debería decir extra (core dumped) , después del mensaje de falla de segmentación .

Los archivos de volcado del núcleo deben encontrarse por defecto en el directorio /cores .


Ejemplo por comandos:

 $ ulimit -c unlimited $ sleep 100 & $ killall -SIGSEGV sleep # Then press Enter few times till below message is shown [1]+ Segmentation fault: 11 (core dumped) sleep 100 $ ls /cores core.13652 $ lldb -c /cores/core.* (lldb) target create --core "/cores/core.13652" Core file '/cores/core.13652' (x86_64) was loaded. (lldb) bt * thread #1, stop reason = signal SIGSTOP * frame #0: 0x00007fffa7d13fde libsystem_kernel.dylib`__semwait_signal + 10 frame #1: 0x00007fffa7c9ab92 libsystem_c.dylib`nanosleep + 199 frame #2: 0x000000010c090002 sleep`rpl_nanosleep + 128 

Consulte también: Nota técnica TN2118 – Núcleos centrales de núcleos .

Apple enumera una serie de maneras de generar archivos de volcado de núcleo en su TN2124 o Mac OS X Debugging Magic .

Aquí hay un par de extractos:

Antes de Mac OS X 10.4, habilitaría los volcados del núcleo en todo el sistema cambiando la línea “COREDUMPS = -NO-” en / etc / hostconfig a “COREDUMPS = -YES-” y luego reiniciando

Y

 # BSH $ ulimit -c unlimited # CSH % limit coredumpsize unlimited 

Incluso puedes hacerlo programáticamente:

 #include  static bool EnableCoreDumps(void) { struct rlimit limit; limit.rlim_cur = RLIM_INFINITY; limit.rlim_max = RLIM_INFINITY; return setrlimit(RLIMIT_CORE, &limit) == 0; } 

En Mac OS X Yosemite, puede habilitar el volcado del núcleo por proceso utilizando LLDB. Suponiendo que su ID de proceso es 51918 , ejecute lo siguiente desde bash:

 $ lldb (lldb) attach 51918 Process 51918 stopped * thread #1: tid = 0x6bf50, 0x00007fff927c14de libsystem_kernel.dylib`mach_msg_trap + 10, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP frame #0: 0x00007fff927c14de libsystem_kernel.dylib`mach_msg_trap + 10 libsystem_kernel.dylib`mach_msg_trap: -> 0x7fff927c14de <+10>: retq 0x7fff927c14df <+11>: nop libsystem_kernel.dylib`mach_msg_overwrite_trap: 0x7fff927c14e0 <+0>: movq %rcx, %r10 0x7fff927c14e3 <+3>: movl $0x1000020, %eax Executable module set to "/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java". Architecture set to: x86_64h-apple-macosx. (lldb) expr long long * $limit = (long long *)malloc(16) (lldb) expr $limit[0] = 0x7fffffffffffffff (long long) $0 = 9223372036854775807 (lldb) expr $limit[1] = 0x7fffffffffffffff (long long) $1 = 9223372036854775807 (lldb) expr (int)setrlimit(4, $limit) (int) $2 = 0 (lldb) detach Process 51918 detached 

Si el proceso causa un error de segmentación, ahora encontrará un núcleo en /cores . Puede verificar que esto esté enviando un SIGABRT a su proceso después de ejecutar lo anterior:

 kill -ABRT 51918 

Tenga en cuenta que adjuntar a un proceso propiedad de root no funcionará en macOSes recientes (El Capitan y versiones posteriores) de forma predeterminada debido a la Protección de integridad del sistema .