2012-11-27 12 views
6

मैं जावा वर्चुअल मशीन थ्रेड से सभी डंप प्राप्त करना चाहता हूं, यह देखने के लिए कि थ्रेड लॉक क्या है और कुछ थ्रेड कुछ संसाधनों को अनलॉक करने के लिए इंतजार कर रहे हैं। कुछ here वर्णित है। मैंने ज़ीगोट प्रक्रिया को मारने का प्रयास किया है लेकिन बिना किसी परिणाम के।एंड्रॉइड में जावा थ्रेड डंप कैसे बनाएं?

उत्तर

-1

यदि आप एक्लिप्स में डीडीएमएस दृश्य पर स्विच करते हैं तो आपके पास थ्रेड देखने के लिए कुछ टूल हैं। क्या आप यही खोज रहे हैं?

+0

लगभग हां। मुझे अभी तक पता नहीं है कि ऑब्जेक्ट लॉक किया गया है, उदाहरण के लिए: - लॉक <0x0000000780b7e688> (एक java.io.InputStreamReader) – Divano

+0

यह उत्तर अप्रचलित है क्योंकि अब कोई ग्रहण नहीं है। –

-1

मुझे लगता है कि आपको किसी ऐप के भीतर थ्रेड की आवश्यकता है। इसके लिए, आप एडीटी ग्रहण प्लगइन पर डीडीएमएस दृश्य का उपयोग कर सकते हैं। यहां दस्तावेज़ http://developer.android.com/tools/debugging/ddms.html#thread

+0

लगभग हां। मुझे अभी तक पता नहीं है कि ऑब्जेक्ट लॉक किया गया है, उदाहरण के लिए: - लॉक <0x0000000780b7e688> (एक java.io.InputStreamReader) – Divano

+0

ग्रहण और डीडीएमएस बहिष्कृत हैं, और एंड्रॉइड प्रोफाइलर कुछ भी नहीं दिखाएगा। मेरे उत्तर के लिए नीचे पढ़ें। –

12

डीडीएमएस, या ग्रहण में एडीटी प्लगइन के साथ सबसे आसान तरीका है। बुनियादी निर्देशों के लिए http://developer.android.com/tools/debugging/ddms.html देखें। संक्षेप में, डिवाइस दृश्य में जाएं, उस ऐप्लिकेशन का चयन करें जिसमें आप रुचि रखते हैं, सुनिश्चित करें कि थ्रेड अपडेट सक्षम हैं, और थ्रेड दृश्य पर स्विच करें। आपको उस प्रक्रिया में धागे की लाइव-अपडेटेड सूची मिल जाएगी। थ्रेड पर डबल-क्लिक करने से वर्तमान स्टैक स्थिति का एक स्नैपशॉट होगा।

आप & को स्टैक ट्रेस पेस्ट करने के लिए चुनिंदा सभी का उपयोग कर सकते हैं और थ्रेड डंप में प्रतिलिपि बना सकते हैं।

यदि आपके पास डेवलपर/रूट डिवाइस है, तो आप रुचि रखने वाली ऐप प्रक्रिया में SIGQUIT भेजकर थ्रेड स्टैक को डंप करने के लिए Dalvik VM से पूछ सकते हैं। उदाहरण के लिए, यदि आप सभी धागे के लिए ढेर देखना चाहते हैं कैलेंडर ऐप्लिकेशन में, आप कुछ इस तरह कर सकता है:

% adb shell ps | grep android.calendar 
u0_a6  2596 127 912804 48296 ffffffff b6f62c10 S com.google.android.calendar 
# 2596 is the process ID 
% adb shell run-as com.google.android.colendar kill -3 2596 

logcat उत्पादन कहेंगे कुछ की तरह:

I/dalvikvm(2596): Wrote stack traces to '/data/anr/traces.txt' 

तो, खींच कि:

% adb pull /data/anr/traces.txt . 

हर बार जब आप कोई प्रक्रिया सिग्नल करते हैं, तो लॉग उस फ़ाइल में संलग्न होते हैं। वहाँ वहाँ में अन्य सामान हो सकता है, तो आप pid 2596 के लिए खोज करने की जरूरत है:

----- pid 2596 at 2012-11-27 12:48:38 ----- 
Cmd line: com.google.android.calendar 

DALVIK THREADS: 
... 

डी डी एम एस धागा दृश्य पर ऐसा करने का लाभ यह है कि, अगर धागा एक मॉनिटर पर अटक गई है, ढेर डंप दे देंगे आप संकेत देते हैं कि किस ऑब्जेक्ट को लॉक किया गया है और वर्तमान में कौन सा थ्रेड लॉक रखता है।

ज़ीगोट प्रक्रिया यहां प्रासंगिक नहीं है; परिभाषा के अनुसार यह एक ऐप नहीं चला रहा है। चूंकि इसमें कोई जेडीडब्ल्यूपी धागा नहीं है, और सिग्क्विट के लिए नहीं सुनता है, इसलिए आप इसे किसी भी तरह से एक स्टैक ट्रेस नहीं प्राप्त कर सकते हैं।

+0

नोट: मुझे अपना पता /data/anr/traces.txt.bugreport –

+0

पर मिला है, नीचे आसान तरीका है। –

1

answer से आदेश लेना, और इसे सभी को एक साथ रखना, यहां निम्न स्क्रिप्ट है। इसे dump.sh फ़ाइल में डालने और निष्पादित करने के लिए, इसे आवश्यक पीआईडी ​​मिलेगी, वर्तमान टाइमस्टैम्प के साथ एक नई फ़ाइल बनाएं और इसके बाद यह थ्रेड-डंप को इसमें लाएगा। यह आदेश उपयोगी हो सकता है जब डंप लाने के लिए बहुत कम समय होता है। इसका उपयोग करने से पहले, सुनिश्चित करें कि निशान /data/anr/traces.txt फ़ाइल में डाल दिए गए हैं या इस मान को स्क्रिप्ट में प्रतिस्थापित करें।

#!/bin/sh 

pid=`./adb shell ps | grep android.calendar | awk '{print $2}'` 
echo $pid 
f=$(date +%s%N) 
echo $f 
./adb shell run-as com.google.android.calendar kill -3 $pid 
./adb pull /data/anr/traces.txt $f 

एक वैकल्पिक फ़ाइल नाम के रूप में, एक f=$(date +"%T.%6N") का उपयोग मानव पठनीय टाइमस्टैम्प प्राप्त करने के लिए कर सकते हैं। आवश्यक फ़ाइल को ढूंढना आसान होगा।

+0

आसान तरीका है, नीचे मेरा जवाब पढ़ें। –

+0

कभी-कभी आप ब्रेकपॉइंट्स का उपयोग नहीं कर सकते हैं। उन मामलों के लिए आप इस स्क्रिप्ट का उपयोग करते हैं। –

0

एंड्रॉइड स्टूडियो में अपने फोन पर बस अपने ऐप को डीबग करें; फिर "डीबग व्यू" में Alt+5 सभी स्टैकट्रैस के डंप प्राप्त करने के लिए, नीचे वाले बाएं कोने पर बस "कैमरा" बटन दबाएं, जिसमें वे ताले लगा रहे हैं।

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