Il semble que je ne puisse pas générer de vidages mémoire sous 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 actuel, mon HOME et/cores/restent vides…
Par défaut, les plantages sont signalés dans .crash
fichiers qui se trouvent dans /Library/Logs/DiagnosticReports
(à l'échelle du système) et ~/Library/Logs/DiagnosticReports
(utilisateur). Ces fichiers peuvent être ouverts à l'aide de Console app, dans Utilisateur ou Rapports système . Le .crash
les fichiers sont au format texte brut et doivent inclure des informations pertinentes sur le plantage.
Afin d'activer les vidages mémoire complets, assurez-vous que /cores
le répertoire a des droits d'écriture pour l'utilisateur actuel (testez par: touch /cores/test && rm /cores/test
). De plus, assurez-vous que vous n'avez aucune limite sur la taille des fichiers principaux en:
ulimit -c unlimited
Le nom du fichier de vidage principal est au format: core
.PID
.
Si le répertoire est masqué, vous pouvez afficher les fichiers masqués en:
defaults write com.Apple.Finder AppleShowAllFiles TRUE
Vous pouvez le tester avec les commandes suivantes:
sleep 100 &
killall -SIGSEGV sleep
ce qui devrait dire extra (core dumped)
, après Message d'erreur de segmentation .
Les fichiers de vidage principaux doivent être trouvés par défaut dans /cores
répertoire.
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 - Dumps Core Kernel .
Vous pouvez générer des fichiers de vidage de mémoire 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 voilà, les fichiers de vidage principaux sont générés dans le /cores
répertoire. Attention, les fichiers de vidage principaux sont gros fichiers donc lorsque vous avez fini de dépanner votre code, supprimez-les.
Apple énumère un certain nombre de façons de générer des fichiers de vidage de mémoire dans leur TN2124 ou Mac OS X Debugging Magic .
Voici quelques extraits:
Avant Mac OS X 10.4, vous pouviez activer les vidages de mémoire à l'échelle du système en modifiant la ligne "COREDUMPS = -NO-" dans/etc/hostconfig en "COREDUMPS = -YES-", puis en redémarrant
Et
# BSH
$ ulimit -c unlimited
# CSH
% limit coredumpsize unlimited
Vous pouvez même le faire par programme:
#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 Mac OS X Yosemite, vous pouvez activer le vidage de mémoire par processus à l'aide de LLDB. En supposant que votre ID 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 $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 vous traitez provoque une erreur de segmentation, vous trouverez maintenant un noyau dans /cores
. Vous pouvez vérifier que cela envoie un SIGABRT à votre processus après avoir exécuté ce qui précède:
kill -ABRT 51918
Veuillez noter que l'attachement au processus appartenant à root ne fonctionnera pas sur les macOS récents (El Capitan et supérieur) par défaut en raison de System Integrity Protection .