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...
4 réponses
vous pouvez générer des fichiers core dump sur Mac Os X comme ceci:
-
créez le fichier:
/etc/launchd.conf
, puis:echo "limit core unlimited" | sudo tee -a /etc/launchd.conf
-
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.
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 .
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;
}
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 .