web-dev-qa-db-fra.com

Comment générer des vidages mémoire sous Mac OS X?

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…

27
alexpirine

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 .

22
kenorb

Vous pouvez générer des fichiers de vidage de mémoire 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 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.

14
TOC

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;
}
8
jww

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 .

5
adamretter