2012-02-23 17 views
15

ऐसा लगता है कि मैक ओएस एक्स 10.6.8 में कोर डंप उत्पन्न नहीं कर सकता।मैक ओएस एक्स में कोर डंप कैसे उत्पन्न करें?

$ 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 .. 

मेरे वर्तमान निर्देशिका, मेरे घर और/कोर/खाली रह ...

+0

संभावित डुप्लिकेट [कोर डंप कहां लिखे गए हैं] (http://stackoverflow.com/questions/2080918/where-are-core-dumps-written-to-in-mac-os-x)।/core/में छिपी हुई फाइलें हो सकती हैं, इसलिए 'डिफ़ॉल्ट लिखें com.apple.finder AppleShowAllFiles TRUE ' – Bort

+0

आपके उत्तर बोर्ट के लिए धन्यवाद, लेकिन मैंने पहले से ही यह धागा देखा है; यह छिपी हुई फाइलों के बारे में नहीं है। – alexpirine

+0

"ulimit -a" क्या कहता है? –

उत्तर

11

आप इस तरह मैक ओएस एक्स पर कोर डंप फ़ाइलें उत्पन्न कर सकते हैं:

  1. फ़ाइल बनाएँ: /etc/launchd.conf, तो:

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

  2. अपने मैक को पुनरारंभ करें।

और यही वह है, कोर डंप फ़ाइलें /cores निर्देशिका में उत्पन्न होती हैं। सावधान रहें कोर डंप फ़ाइलें बड़ी फ़ाइलें इसलिए जब आप अपना कोड समस्या निवारण समाप्त करते हैं, तो उन्हें हटा दें।

+1

मैंने ऐसा किया और कुछ भी अलग नहीं हुआ। क्या सिस्टम इसे उठाएगा? क्या मुझे JVM सेटिंग्स में कोर डंप सक्षम करने की आवश्यकता है? – Developer

+1

क्या डिफ़ॉल्ट रूप से दुर्घटनाग्रस्त प्रोग्राम की निर्देशिका में कोर डंप फ़ाइल उत्पन्न करने का कोई तरीका है? – Will

5

ऐप्पल अपने TN2124 या Mac OS X Debugging Magic में कोर डंप फ़ाइलों को उत्पन्न करने के कई तरीकों की सूची देता है।

यहाँ निष्कर्षों की एक जोड़ी है:

पहले Mac OS X 10.4 के लिए, आप के लिए सक्षम होगा मुख्य लाइन "COREDUMPS = -NO-"/आदि में बदलकर एक सिस्टम-वाइड आधार पर उदासीनता/ करने के लिए "COREDUMPS = -YES-" hostconfig और फिर

और

# BSH 
$ ulimit -c unlimited 

# CSH 
% limit coredumpsize unlimited 

तुम भी यह programatic कर सकते हैं पुन: प्रारंभ सहयोगी:

#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

'/ etc/hostconfig' फ़ाइल में टिप्पणी कहती है:' यह फ़ाइल दूर जा रही है ', इसलिए इस फ़ाइल को जल्द ही कम किया जाएगा। पहले 'hostconfig' में मिली प्राथमिकताओं का प्रकार अब लॉन्च .plist फ़ाइलों के भीतर निहित है। उदाहरण के लिए, जब आप सिस्टम प्राथमिकताओं में एएफपी साझाकरण बंद करते हैं, तो इसे 'com.apple.AppleFileServer.plist' में जोड़ा जाता है '/ सिस्टम/लाइब्रेरी/लॉन्चडेमन्स' – kenorb

15

कोर डंप की पीढ़ी को सक्रिय करने के निर्देशिका /cores/ मौजूद होना चाहिए और उपयोगकर्ता कार्यक्रम चलाने के लिए उस पर लिखने की अनुमति होना आवश्यक है।

ulimit -c unlimited 

कोर डंप फ़ाइल का स्वरूप core है: इसके अलावा, यकीन है कि आप द्वारा कोर फ़ाइल आकार पर कोई सीमा नहीं है बनाते हैं। PID

निर्देशिका छिपा हुआ है, तो आप से छिपी हुई फ़ाइलें दिखा सकते हैं: विभाजन के बाद

sleep 100 & 
killall -SIGSEGV sleep 

जो कहना चाहिए अतिरिक्त (core dumped),:

defaults write com.apple.finder AppleShowAllFiles TRUE 

आप निम्न कमांड द्वारा कि परीक्षण कर सकते हैं गलती संदेश।

कोर डंप फ़ाइलों को डिफ़ॉल्ट रूप से /cores निर्देशिका में पाया जाना चाहिए।आदेशों द्वारा


उदाहरण:

$ 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 

यह भी देखें: Technical Note TN2118 - Kernel Core Dumps

+0

यह सच है, लेकिन एक वास्तविक कोर डंप के रूप में उपयोगी नहीं है; यदि आपको एप्लिकेशन को क्रैश (और क्रैश के आस-पास के संदर्भ) पर अधिक जानकारी चाहिए, तो कोर डंप के लिए कोई विकल्प नहीं है यदि आप किसी भी कारण से अपनी मशीन पर क्रैश परिदृश्य को दोहराना नहीं चाहते हैं। – fraveydank

+0

@fraveydank मैंने भ्रम से बचने के लिए उत्तर को सरल बना दिया है। ओएस एक्स का कोर डंप का अपना प्रारूप है और उनके पास उचित संदर्भ है। ये कोर डंप फ़ाइलें '/ कोर्रेस 'में पाई जा सकती हैं। – kenorb

4

मैक ओएस एक्स योसेमेट पर, आप एलएलडीबी का उपयोग कर प्रति-प्रक्रिया आधार पर कोर डंप को सक्षम कर सकते हैं।

$ 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 

आप इस प्रक्रिया के एक विभाजन गलती का कारण बनता है, तो आप अब /cores में एक कोर मिलेगा: अपनी प्रक्रिया आईडी मान लिया जाये कि पार्टी से निम्नलिखित चलाने 51918 है। आप देख सकते हैं कि यह आपके प्रक्रिया के लिए एक SIGABRT भेज ऊपर चलाने के बाद:

kill -ABRT 51918 

कृपया ध्यान दें कारण System Integrity Protection को डिफ़ॉल्ट रूप से जड़ के स्वामित्व में कार्रवाई करने के लिए संलग्न है कि हाल ही में macOSes पर काम नहीं करेगा (एल कैप्टन और ऊपर) ।