Comment générer des dumps dans Mac OS X?

il semble que je ne puisse pas générer des dumps de coeur dans 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 ..

Mon répertoire courant, ma MAISON et /carottes/ rester vide...

18
demandé sur kenorb 2012-02-23 15:29:40

4 réponses

vous pouvez générer des fichiers core dump sur Mac Os X comme ceci:

  1. créez le fichier: /etc/launchd.conf , puis:

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

  2. redémarrez votre Mac.

et c'est tout, les fichiers core dump sont générés dans le répertoire /cores . Attention les fichiers de dump de base sont grands fichiers donc quand vous terminer le dépannage de votre code, les supprimer.

12
répondu TOC 2013-11-05 15:36:36

par défaut, les accidents sont rapportés dans les fichiers .crash qui se trouvent dans /Library/Logs/DiagnosticReports (système) et ~/Library/Logs/DiagnosticReports (utilisateur). Ces fichiers peuvent être ouverts en utilisant Console app, dans utilisateur ou rapports système . Les fichiers .crash sont en format texte simple et doivent inclure des informations pertinentes sur l'accident.


afin d'activer le vidage complet du noyau, assurez-vous que le répertoire /cores a des permissions d'écriture pour l'utilisateur courant (test par: touch /cores/test && rm /cores/test ). En outre, assurez-vous que vous n'avez pas de limites sur la taille des fichiers core par:

ulimit -c unlimited

le nom du fichier core dump est au format: core . PID .

Si le répertoire est caché, vous pouvez afficher les fichiers cachés par:

defaults write com.apple.finder AppleShowAllFiles TRUE

vous pouvez tester que par le suivant commandes:

sleep 100 &
killall -SIGSEGV sleep

qui devrait dire extra (core dumped) , après segmentation fault message.

les fichiers core dump doivent être trouvés par défaut dans le répertoire /cores .


exemple par commandes:

$ 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

Voir aussi: Note technique TN2118 - Core Kernel Core Dumps .

17
répondu kenorb 2018-03-16 23:47:33

Apple Liste un certain nombre de façons de générer des fichiers core dump dans leur TN2124 ou Mac OS X Debugging Magic .

Voici quelques extraits:

avant Mac OS X 10.4, vous activez les dumps de coeur sur un système entier base en remplaçant la ligne "COREDUMPS= - NO -" dans / etc / hostconfig par "Les coredumps=-OUI-" et puis en redémarrant

et

# BSH
$ ulimit -c unlimited

# CSH
% limit coredumpsize unlimited

Vous pouvez même le faire par programmation:

#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;
}
5
répondu jww 2013-11-28 06:39:56

sur le Mac OS X Yosemite, vous pouvez activer le vidage du cœur sur une base par processus en utilisant LLDB. En supposant que votre identifiant de processus est 51918 , exécutez ce qui suit à partir de 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   "151900920"x1000020, %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) "151900920" = 9223372036854775807
(lldb) expr $limit[1] = 0x7fffffffffffffff
(long long)  = 9223372036854775807
(lldb) expr (int)setrlimit(4, $limit)
(int)  = 0
(lldb) detach
Process 51918 detached

si vous traitez un défaut de segmentation, vous trouverez un noyau dans /cores . Vous pouvez vérifier cela en envoyant un SIGABRT à votre processus après avoir exécuté ce qui précède:

kill -ABRT 51918

veuillez noter que s'attacher au processus appartenant à root ne fonctionnera pas sur macOSes récents (El Capitan et supérieurs) par défaut en raison de Protection De L'intégrité du système .

5
répondu adamretter 2017-07-28 19:03:30