2012-02-23 6 views
15

Sembra che non sia possibile generare core dump in Mac OS X 10.6.8.Come generare core dump in 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 .. 

mia directory corrente, la mia casa e/core/rimangono vuote ...

+0

possibile duplicato di [Dove sono scritti i core dump] (http://stackoverflow.com/questions/2080918/where-are-core-dumps-written-to-in-mac-os-x)./core/potrebbe contenere file nascosti, quindi impostare 'defaults write com.apple.finder AppleShowAllFiles TRUE' – Bort

+0

Grazie per la tua risposta Bort, ma ho già visto questo thread; non si tratta di file nascosti. – alexpirine

+0

Cosa dice "ulimit -a"? –

risposta

11

è possibile generare i file core dump su Mac Os X come questo:

  1. Creare il file: /etc/launchd.conf, poi:

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

  2. Riavvia il tuo Mac.

E questo è tutto, i file core dump vengono generati nella directory /cores. Fai attenzione che i file di dump di base sono file grandiosi , quindi quando finisci di risolvere il problema, rimuovili.

+1

L'ho fatto e non è successo nulla di diverso. Il sistema dovrebbe raccoglierlo? Devo abilitare il core dump nelle impostazioni JVM? – Developer

+1

C'è un modo per generare il file core dump nella directory del programma bloccato per impostazione predefinita? – Will

5

Apple elenca un numero di modi per generare file di dump di base nei rispettivi numeri TN2124 o Mac OS X Debugging Magic.

Ecco un paio di estratti:

precedenti a Mac OS X 10.4, si dovrebbe abilitare i core dump su una livello di sistema cambiando la riga "coredumps = -NO-" in/etc/hostconfig a "coredumps = -Yes-" e quindi riavviare

e

# BSH 
$ ulimit -c unlimited 

# CSH 
% limit coredumpsize unlimited 

si può anche farlo programmatico alleato:

#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

Nel file '/ etc/hostconfig' il commento dice:' Questo file sta andando via ', quindi questo file sarebbe presto ammortizzato. Il tipo di preferenze precedentemente trovato in 'hostconfig' ora è contenuto nei file launchd .plist. Ad esempio, quando disattivi la condivisione AFP in Preferenze di Sistema, questa viene aggiunta a 'com.apple.AppleFileServer.plist' in'/System/Library/LaunchDaemons' – kenorb

15

Per attivare la generazione di core dump, la directory /cores/ deve esistere e l'utente che esegue il programma deve avere i permessi di scrittura su di esso. Inoltre, assicurarsi che non si dispone di alcun limite sulla dimensione dei file di base per:

ulimit -c unlimited 

Il formato del file core dump è core. PID.

Se la directory è nascosta, è possibile visualizzare i file nascosti per:

defaults write com.apple.finder AppleShowAllFiles TRUE 

è possibile verificare che i seguenti comandi:

sleep 100 & 
killall -SIGSEGV sleep 

che dovrebbe dire in più (core dumped), dopo Segmentazione errore messaggio.

I file di dump di base devono essere trovati per impostazione predefinita nella directory /cores.


Esempio da comandi:

$ 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 

Vedi anche: Technical Note TN2118 - Kernel Core Dumps.

+0

Questo è vero, ma non così utile come un vero core dump; se hai bisogno di maggiori informazioni su _why_ l'applicazione si è bloccata (e il contesto che circonda l'arresto anomalo), non c'è alcun sostituto per un core dump se non puoi replicare lo scenario di crash sul tuo computer per qualsiasi motivo. – fraveydank

+0

@fraveydank Ho semplificato la risposta per evitare confusione. OS X ha il proprio formato di core dump e hanno un contesto appropriato. Questi file di dump di base possono essere trovati in '/ core'. – kenorb

4

Su Mac OS X Yosemite, è possibile abilitare il core dump su una base per processo utilizzando LLDB. Assumendo che il processo è id 51918, eseguire il seguente da 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 

Se processo causa un errore di segmentazione, si ora trovare un nucleo in /cores. È possibile controllare questo essere l'invio di un SIGABRT al vostro processo dopo aver eseguito quanto sopra:

kill -ABRT 51918 

prega di notare che il collegamento al processo di proprietà di root non funziona sui recenti macOSes (El Capitan e sopra) di default a causa di System Integrity Protection .