2012-02-23 18 views
15

Parece que no puedo generar volcados del núcleo en Mac OS X 10.6.8.¿Cómo generar volcados centrales en Mac OS X?

$ ulimit -c unlimited 
$ ./a.out 
Hello world! 
Segmentation fault 
$ find ~/ -type f -name core 

# ls -la /cores/ 
total 0 
[email protected] 2 root admin 68 24 jui 2010 . 
drwxrwxr-t 31 root admin 1122 17 oct 15:52 .. 

Mi directorio actual, mi hogar y/núcleos/permanecen vacías ...

+0

posible duplicado de [Donde están escritos los volcados del núcleo] (http://stackoverflow.com/questions/2080918/where-are-core-dumps-written-to-in-mac-os-x)./core/puede contener archivos ocultos, por lo tanto establece 'defaults write com.apple.finder AppleShowAllFiles TRUE' – Bort

+0

Gracias por tu respuesta Bort, pero ya he visto este hilo; no se trata de archivos ocultos. – alexpirine

+0

¿Qué dice "ulimit -a"? –

Respuesta

11

Puede generar archivos de volcado de núcleo en Mac OS X como esto:

  1. Crear el archivo: /etc/launchd.conf, entonces:

    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 con los archivos de volcado de núcleo que son archivos de gran tamaño por lo que cuando termine de solucionar su código, elimínelos.

+1

Lo hice y nada sucedió de manera diferente. ¿Se supone que el sistema recogerá eso? ¿Debo habilitar el volcado del núcleo en la configuración de JVM? – Developer

+1

¿Hay alguna manera de generar el archivo de volcado de memoria en el directorio del programa bloqueado por defecto? – Will

5

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

Aquí hay un par de extractos:

Antes de Mac OS X 10.4, que permitiría a los volcados de memoria de forma de todo el sistema al cambiar la línea "coredumps = NO-" en/etc/hostconfig a "coredumps = -YES-" y luego reiniciar

y

# BSH 
$ ulimit -c unlimited 

# CSH 
% limit coredumpsize unlimited 

incluso puede hacerlo programática aliado:

#include <sys/resource.h> 

static bool EnableCoreDumps(void) 
{ 
    struct rlimit limit; 

    limit.rlim_cur = RLIM_INFINITY; 
    limit.rlim_max = RLIM_INFINITY; 
    return setrlimit(RLIMIT_CORE, &limit) == 0; 
} 
+0

En el archivo '/ etc/hostconfig' el comentario dice:' Este archivo se va ', por lo que este archivo se depreciará pronto. El tipo de preferencias encontradas anteriormente en 'hostconfig' ahora se encuentra dentro de los archivos .plist de launchd. Por ejemplo, cuando desactiva el uso compartido de AFP en Preferencias del sistema, se agrega al 'com.apple.AppleFileServer.plist' en'/System/Library/LaunchDaemons' – kenorb

15

Para activar la generación de volcado de memoria, el directorio /cores/ debe existir y el usuario que ejecuta el programa debe tener permisos de escritura en él. Además, asegúrese de que usted no tiene ningún límite en tamaño de los archivos de núcleo por:

ulimit -c unlimited 

El formato del archivo de vaciado es core. PID.

Si el directorio está oculto, puede mostrar los archivos ocultos por:

defaults write com.apple.finder AppleShowAllFiles TRUE 

usted puede probar que mediante los siguientes comandos:

sleep 100 & 
killall -SIGSEGV sleep 

que debería decir adicional (core dumped), después Segmentación mensaje de error.

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


ejemplo mediante 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 

Ver también: Technical Note TN2118 - Kernel Core Dumps.

+0

Esto es cierto, pero no tan útil como un verdadero volcado de núcleo; si necesita más información sobre _por qué _ la aplicación se bloqueó (y el contexto que rodea el bloqueo), simplemente no hay sustituto para un volcado de núcleo si no puede replicar el escenario de bloqueo en su máquina por cualquier motivo. – fraveydank

+0

@fraveydank He simplificado la respuesta para evitar confusiones. OS X tiene su propio formato de volcados centrales y tienen un contexto adecuado. Estos archivos de volcado de núcleo se pueden encontrar en '/ núcleos'. – kenorb

4

En Mac OS X Yosemite, puede habilitar el volcado de núcleos por proceso utilizando LLDB. Asumiendo que su identificador 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 proceso provoca una violación de segmento, ahora encontrar un núcleo en /cores. Esto se puede comprobar enviará una SIGABRT a su proceso después de ejecutar lo anterior:

kill -ABRT 51918 

Tenga en cuenta que la fijación de procesar propiedad de raíz no funcionará en macOSes recientes (El Capitán y por encima) por defecto debido a System Integrity Protection .