2009-11-19 10 views
7

मेरा आवेदन ज्यादातर जावा है लेकिन, कुछ गणनाओं के लिए, सी ++ लाइब्रेरी का उपयोग करता है। हमारा पर्यावरण जावा 1.6 रेडहाट 3 पर चल रहा है (जल्द ही रेडहाट 5 होगा)।जावा जेएनआई का उपयोग करते समय कोर डंप को डीबग करना संभव है?

मेरी समस्या यह है कि C++ लाइब्रेरी थ्रेड-सुरक्षित नहीं है। इसके आसपास काम करने के लिए, हम एकाधिक, सिंगल-थ्रेडेड "वर्कर" प्रक्रियाएं चलाते हैं और उन्हें केंद्रीय कार्य प्रबंधक से काम करने के लिए काम करते हैं, जिसे सी ++ में भी लिखा गया है। हमारा जावा एप्लिकेशन सी ++ वर्क मैनेजर को किसी तृतीय-पक्ष उत्पाद के माध्यम से कॉल करता है।

विभिन्न कारणों से, हम फिर से लिखने के लिए सी ++ कार्य प्रबंधक और कर्मचारियों चाहते हैं। मैं जावा में सभी को लिखने के पक्ष में हूं, प्रत्येक कार्यकर्ता में जेएनआई का उपयोग करके सी ++ लाइब्रेरी को कॉल करने के लिए।

मुख्य समस्या यह होती है कि सी ++ लाइब्रेरी कोर डंप हो तो क्या होता है। दुर्भाग्यवश, यह काफी आम है, और हमें यह देखने में सक्षम होना चाहिए कि हमारी सी ++ लाइब्रेरी में कौन सी रेखा समस्या का कारण बनती है, उदा। जीडीबी जैसे कुछ में बैकट्रैक की जांच करके।

मेरे साथियों का मानना ​​है कि यह, कोर डंप का विश्लेषण करने के क्योंकि GDB जैसे उपकरणों कोर जावा द्वारा उत्पादित फ़ाइलों समझ में नहीं आता असंभव होगा।

मुझे आशा है कि वे गलत हैं कि, लेकिन मैं अपने विचारों को आगे धकेलने से पहले यह सुनिश्चित करने की जरूरत है।

जावा/जेएनआई से उत्पादित कोर डंप का विश्लेषण करने का सबसे अच्छा तरीका क्या है?

उत्तर

7

हाँ, वहां है। जेएनआई भाग में एसआईजीएसईजीवी की वजह से हर बार जेवीएम दुर्घटनाग्रस्त हो जाता है, आपको $ JAVA_HOME/bin निर्देशिका में कोर डंप के साथ एक फ़ाइल मिल जाएगी। यह आमतौर पर hs_err_PID.log नाम है।

आप अधिक जानकारी here, और here मिल सकती है। Here कुछ हद तक संबंधित स्टैक ओवरफ्लो प्रश्न है।

+2

धन्यवाद पाब्लो। कोहसुके का लेख उत्कृष्ट है। दुर्भाग्यवश, अगर मैं अपने सहयोगियों को बताता हूं कि उन्हें यह पता लगाने के लिए असेंबलर को समझने की आवश्यकता होगी कि सी ++ लाइन ने सीजी गलती क्यों की है, तो वे एक मील दौड़ेंगे। मैं लिनक्स पर हूं और मेरी .so फ़ाइलों को डीबग ध्वज के साथ संकलित किया गया है। शायद यह प्रक्रिया को आसान बना देगा। –

+1

क्षमा करें, लेकिन 'लॉग' फ़ाइल के पास ओ.पी. के बारे में पूछे गए कॉर्डम्प के साथ कुछ लेना देना नहीं है। –

+0

मुझे इन hs_err_PID फ़ाइलों को/tmp निर्देशिका में मिला। – Aman

2

कोर gdb आप इसे करने के जावा आभासी मशीन जोड़ने के लिए में पढ़ा फ़ाइल प्राप्त करने के लिए। यही कारण है कि

gdb /usr/local/jdk1.8.0_66/bin/java core 

तो बहुत संभव है आपको बता देंगे कि प्रतीकों में से एक टन नहीं पाए जाते हैं (जो सामान्य है, इन JVM प्रतीक हैं) है। हालांकि, यदि आप 'बीटी' टाइप करते हैं तो जेएनआई कॉल क्रैश हो सकता है जो आपके स्टैकट्रैक में दिखाई दे सकता है। एक उदाहरण है, मेरी स्थिति है, जहां मैं एक देशी पुस्तकालय मैंने लिखा में एक दुर्घटना है में है:

(gdb) bt 
#0 0x00007fd61dfcd107 in __GI_raise ([email protected]=6) 
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007fd61dfce4e8 in __GI_abort() at abort.c:89 
#2 0x00007fd61d8d3795 in os::abort(bool)() 
    from /usr/local/jdk1.8.0_66/jre/lib/amd64/server/libjvm.so 
#3 0x00007fd61da71e23 in VMError::report_and_die()() 
    from /usr/local/jdk1.8.0_66/jre/lib/amd64/server/libjvm.so 
#4 0x00007fd61d8d8fbf in JVM_handle_linux_signal() 
    from /usr/local/jdk1.8.0_66/jre/lib/amd64/server/libjvm.so 
#5 0x00007fd61d8cf753 in signalHandler(int, siginfo*, void*)() 
    from /usr/local/jdk1.8.0_66/jre/lib/amd64/server/libjvm.so 
#6 <signal handler called> 

पहले 6 फ्रेम सभी दुर्घटना प्रक्रिया ही से संबंधित हैं। एक संकेत पकड़ा और प्रेषित किया गया था। और हालांकि हम सटीक कार्यों को नहीं जानते हैं, इससे कोई फर्क नहीं पड़ता। फ्रेम 7 से शुरू, हम जेएनआई लाइब्रेरी में हैं जो हमने लिखा था। और यदि यह अभी भी संलग्न प्रतीक था तो आप उन्हें देखेंगे।

#7 0x00007fd5ff43bf7e in FftResampler::resample(Complex const*, int) 
    () 
    from /I/home/werner/BpmDj/NextGen/Beta/Desktop/test/libzathras-46703-64.so 
#8 0x00007fd5ff43ddcf in TimeStretcher::rescaleEnvelopeSlow(PeakMap const*, Peak*)() 
    from /I/home/werner/BpmDj/NextGen/Beta/Desktop/test/libzathras-46703-64.so 
#9 0x00007fd5ff43e4a5 in TimeStretcher::transferPeak(Frame*, Frame*) 
    () 
    from /I/home/werner/BpmDj/NextGen/Beta/Desktop/test/libzathras-46703-64.so 
#10 0x00007fd5ff43e679 in TimeStretcher::transferPeaks(Channel*)() 
    from /I/home/werner/BpmDj/NextGen/Beta/Desktop/test/libzathras-46703-64.so 
#11 0x00007fd5ff43eb3a in TimeStretcher::putStereo(float const*, int) 
    () 
    from /I/home/werner/BpmDj/NextGen/Beta/Desktop/test/libzathras-46703-64.so 
#12 0x00007fd5ff43edbf in TimeStretcher::processStereo(float const*, int, float*)() 
    from /I/home/werner/BpmDj/NextGen/Beta/Desktop/test/libzathras-46703-64.so 
#13 0x00007fd5ff43b45d in Java_org_yellowcouch_bpmdj_mixedit_audio_JavaTimeStretcher_processStereo() 
    from /I/home/werner/BpmDj/NextGen/Beta/Desktop/test/libzathras-46703-64.so 

और फ्रेम 14 से आगे हम जावा भूमि में वापस आ गए हैं।

#14 0x00007fd6097a29e1 in ??() 
#15 0x00007fd5d6ee6580 in ??() 
#16 0x00000000853f53e8 in ??() 
#17 0x00000000d803c340 in ??() 
#18 0x00000000d80564e8 in ??() 
#19 0x00007fd61e773609 in _L_unlock_554() 
    from /lib/x86_64-linux-gnu/libpthread.so.0 

तो आप देखते हैं कि यह पूरी तरह से असंभव gdb के माध्यम से मूल फ़ाइलों से बाहर कुछ जानकारी प्राप्त करने के लिए नहीं है। बस जेवीएम को इसके पहले तर्क के रूप में जोड़ने के लिए मत भूलना।

यह संभव है कि जीडीबी मूल पुस्तकालय को न पाएं। उस मामले में आप मैन्युअल रूप से इस प्रकार प्रतीकों लोड करने के लिए चाहते हो सकता है:

gdb> प्रतीक-फ़ाइल libzathras-46,703-64।इसलिए

यदि आप और भी जानकारी चाहते हैं, तो आप डीबग जानकारी के साथ अपने सी/सी ++ कोड को संकलित करना चाहेंगे। आम तौर पर मिंगव और जीसीसी कंपाइलर के साथ आप कमांड लाइन विकल्पों में ए-जी जोड़ते हैं। यह आपको निम्न जानकारी प्रदान करेगा, जिसमें लाइन नंबर और भी शामिल है।

#7 FftResampler::resample ([email protected]=0x7f4bf8f36100, 
    [email protected]=0x7f4bf8ed1ea0, n=<optimized out>) 
    at timestretcher.cpp:347 
#8 0x00007f4c51605dcf in TimeStretcher::rescaleEnvelopeSlow (
    this=0x7f4bf8ec1e10, table=0x7f4bf90f4c20, borders=0x7f4bf8fd27a0) 
    at timestretcher.cpp:878 
#9 0x00007f4c516064a5 in TimeStretcher::transferPeak (
    [email protected]=0x7f4bf8ec1e10, 
    [email protected]=0x7f4bf8fde6f0, 
    [email protected]=0x7f4bf8fb2650) at timestretcher.cpp:718 
#10 0x00007f4c51606679 in TimeStretcher::transferPeaks (
    [email protected]=0x7f4bf8ec1e10, 
    [email protected]=0x7f4bf8ec9e90) at timestretcher.cpp:687 
#11 0x00007f4c51606b3a in TimeStretcher::putStereo (
    [email protected]=0x7f4bf8ec1e10, [email protected]=0x7f4bf8eb9e00, 
    [email protected]=-1395) at timestretcher.cpp:1483 
#12 0x00007f4c51606dbf in TimeStretcher::processStereo (
    [email protected]=0x7f4bf8ec1e10, [email protected]=0x7f4bf8eb9e00, 
    [email protected]=-1395, out=0x7f4bf90f4c60) 
    at timestretcher.cpp:1567 
#13 0x00007f4c5160345d in Java_org_yellowcouch_bpmdj_mixedit_audio_JavaTimeStretcher_processStereo (env=0x7f4bf90f71f8, obj=<optimized out>, 
    handle=139964275465728, in=0x7f4bed136468, inIdx=<optimized out>, 
    time=-1395, out=0x7f4bed136480) at timestretcher-jni.cpp:69 
+0

भी, यह न भूलें कि समस्या के कारण कोड की सटीक रेखा प्राप्त करने के लिए आप डंप से पते के साथ 'addr2line' का उपयोग कर सकते हैं। – Shark

संबंधित मुद्दे