जवाबों:
यदि आपका ऐप अन्य लोगों द्वारा डाउनलोड किया जा रहा है और दूरस्थ उपकरणों पर क्रैश हो रहा है, तो आप Android त्रुटि रिपोर्टिंग लाइब्रेरी ( इस SO पोस्ट में संदर्भित ) पर गौर करना चाहते हैं । यदि यह केवल आपके स्वयं के स्थानीय डिवाइस पर है, तो LogCat.
क्रैश होने पर डिवाइस होस्ट मशीन से कनेक्ट नहीं होने पर भी आप इसका उपयोग कर सकते हैं , डिवाइस को कनेक्ट करने और एक adb logcat
कमांड जारी करने से संपूर्ण लॉगकैट इतिहास (कम से कम इस सीमा तक डाउनलोड हो जाएगा) बफ़र किया जाता है जो आमतौर पर लॉग डेटा का एक लूप होता है, यह सिर्फ अनंत नहीं है)। क्या उन विकल्पों में से कोई भी आपके प्रश्न का उत्तर देता है? यदि आप यह स्पष्ट करने का प्रयास नहीं कर सकते हैं कि आप थोड़ा और क्या देख रहे हैं?
adb logcat
लिए जो भी निर्देशिका एडीबी में स्थित है से वैकल्पिक रूप से आप एसडीके उपकरण Eclipse प्लग में शामिल कर सकते हैं।
$SDK_DIR/platform-tools/
। त्रुटि दिखाने के लिए:.\adb.exe logcat -v time *:E
ऐसा करने का तरीका Thread.UncaughtExceptionHandler
इंटरफ़ेस को लागू करना है और इसे Thread.setDefaultUncaughtExceptionHandler()
अपनी गतिविधि की शुरुआत में पास करना है onCreate()
। यहाँ कार्यान्वयन वर्ग है TopExceptionHandler
।
public class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
public TopExceptionHandler(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.app = app;
}
public void uncaughtException(Thread t, Throwable e) {
StackTraceElement[] arr = e.getStackTrace();
String report = e.toString()+"\n\n";
report += "--------- Stack trace ---------\n\n";
for (int i=0; i<arr.length; i++) {
report += " "+arr[i].toString()+"\n";
}
report += "-------------------------------\n\n";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if(cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i=0; i<arr.length; i++) {
report += " "+arr[i].toString()+"\n";
}
}
report += "-------------------------------\n\n";
try {
FileOutputStream trace = app.openFileOutput("stack.trace",
Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
}
नोट हम एंड्रॉइड फ्रेमवर्क के डिफॉल्ट को इसे हैंडल करने देते हैं।
अपनी गतिविधि के शीर्ष पर इस तरह से ऊपर की कक्षा का एक उदाहरण दर्ज करें:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
...
यह हैंडलर एक फाइल में ट्रेस को बचाता है। जब ReaderScope
अगली बार पुनरारंभ होता है, तो यह फ़ाइल का पता लगाता है और उपयोगकर्ता को संकेत देता है कि वह डेवलपर को ईमेल करना चाहता है।
स्टैक ट्रेस को ईमेल करने के लिए, इसे ईमेल में पैक करने के लिए कोड का पालन करें।
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(ReaderScopeActivity.this.openFileInput("stack.trace")));
while((line = reader.readLine()) != null) {
trace += line+"\n";
}
} catch(FileNotFoundException fnfe) {
// ...
} catch(IOException ioe) {
// ...
}
Intent sendIntent = new Intent(Intent.ACTION_SEND);
String subject = "Error report";
String body = "Mail this to appdeveloper@gmail.com: " + "\n" + trace + "\n";
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"readerscope@altcanvas.com"});
sendIntent.putExtra(Intent.EXTRA_TEXT, body);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.setType("message/rfc822");
ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));
ReaderScopeActivity.this.deleteFile("stack.trace");
या आप ACRA त्रुटि रिपोर्टिंग प्रणाली का भी उपयोग कर सकते हैं। बस अपनी परियोजना के कामों में ACRA.jar को शामिल करें और अपने लांचर गतिविधि वर्ग घोषणा से पहले नीचे दिए गए कोड स्निपेट का उपयोग करें।
@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT)
या आप इसे कंसोल से आज़मा सकते हैं: -
adb logcat -b crash
यह http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html से है
आप adb का उपयोग कर सकते हैं:
adb logcat AndroidRuntime:E *:S
आप इसे कंसोल से आज़मा सकते हैं:
adb logcat --buffer=crash
इस विकल्प पर अधिक जानकारी:
adb logcat --help
...
-b <buffer>, --buffer=<buffer> Request alternate ring buffer, 'main',
'system', 'radio', 'events', 'crash', 'default' or 'all'.
Multiple -b parameters or comma separated list of buffers are
allowed. Buffers interleaved. Default -b main,system,crash.
यदि आप ग्रहण का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप डिबग का उपयोग करते हैं और नहीं चलाते हैं। सुनिश्चित करें कि आप डिबग परिप्रेक्ष्य में हैं (शीर्ष दाएं) आपको लॉग को प्रिंट करने के लिए कुछ समय के लिए 'पुनरारंभ' (F8) को हिट करना पड़ सकता है। क्रैश लॉग नीचे लॉगकॉट विंडो में होगा- फ़ुलस्क्रीन के लिए डबल क्लिक करें और सुनिश्चित करें कि आप नीचे स्क्रॉल करें। आपको त्रुटियों के लिए लाल पाठ दिखाई देगा, क्रैश ट्रेस कुछ इस तरह होगा
09-04 21:35:15.228: ERROR/AndroidRuntime(778): Uncaught handler: thread main exiting due to uncaught exception
09-04 21:35:15.397: ERROR/AndroidRuntime(778): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dazlious.android.helloworld/com.dazlious.android.helloworld.main}: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.access$1800(ActivityThread.java:112)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.os.Looper.loop(Looper.java:123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.main(ActivityThread.java:3948)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at java.lang.reflect.Method.invokeNative(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at java.lang.reflect.Method.invoke(Method.java:521)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at dalvik.system.NativeStart.main(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.example.android.helloworld.main.onCreate(main.java:13)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): ... 11 more
इसके लिए महत्वपूर्ण भाग हैं
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.example.android.helloworld.main.onCreate(main.java:13)
वे बताते हैं कि यह ऑन लाइन विधि में main.java की लाइन 13 पर सीमा अपवाद से एक सरणी था।
आप Apphance का उपयोग कर सकते हैं। यह एक क्रॉस-प्लेटफ़ॉर्म सेवा है (अब मुख्य रूप से एंड्रॉइड, अपने रास्ते में अन्य प्लेटफार्मों के साथ आईओएस) जो किसी भी मोबाइल डिवाइस को दूरस्थ रूप से डीबग करने की अनुमति देता है (एंड्रॉइड, आईओएस अब - विकास के तहत अन्य)। यह सिर्फ एक दुर्घटना से कहीं अधिक है, वास्तव में यह बहुत अधिक है: लॉगिंग, परीक्षकों द्वारा समस्याओं की रिपोर्टिंग, क्रैशलॉग। इसे एकीकृत करने में लगभग 5 मिनट लगते हैं। वर्तमान में आप बंद बीटा तक पहुंच के लिए अनुरोध कर सकते हैं।
डिस्क्लेमर: मैं Polidea का CTO हूं, Apphance के पीछे एक कंपनी है और इसके सह-निर्माता हैं।
अद्यतन: Apphance अब बंद बीटा नहीं है! अद्यतन 2: Apphance http://applause.com पेशकश के भाग के रूप में उपलब्ध है
libs
निर्देशिका में apphance.jar को रखना होगा क्योंकि यह SO उत्तर बताता है। यह जीथब कमिटमेंट उन बदलावों को दिखाता है, जिन्हें मुझे अपने वर्ल्डपैप ऐप में उपयोग करने के लिए आवश्यक थे।
यहाँ क्रैश लॉग के लिए एक और समाधान है।
Android बाजार में "क्रैश कलेक्टर" नाम का टूल है
अधिक जानकारी के लिए निम्न लिंक की जाँच करें
http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html
आप से ACRA उपयोग कर सकते हैं इस । इस लाइब्रेरी को अपनी परियोजनाओं में शामिल करना और इसे कॉन्फ़िगर करना, आप उनकी क्रैश रिपोर्ट में प्राप्त कर सकते हैं (अपने ईमेल या gdocs में)। मेरी खराब इंग्लिश के लिए माफ़ कीजिये।
यदि आप एक मूल क्रैश रिपोर्टिंग टूल की तलाश कर रहे हैं, तो क्रैश- ट्रेटिक्स का प्रयास करें ।
यदि आप अधिक उन्नत रिपोर्टिंग टूल चाहते हैं, तो चेकआउट ग्रिफोनेट । यह कोड की सटीक लाइन के साथ हुई सभी दुर्घटनाओं को लॉग करता है जो स्वचालित मार्करों के साथ दुर्घटना का कारण बनता है जो आपको उपयोगकर्ता द्वारा दुर्घटना से पहले उठाए गए कदमों को दिखाता है और अधिक।
सौभाग्य!
मैंने आपकी सभी समस्याओं को हल करने के लिए यह लाइब्रेरी बनाई है। क्रैश रिपोर्टर आपके सभी क्रैश को कैप्चर करने और उन्हें स्थानीय रूप से डिवाइस में लॉग करने का एक आसान उपकरण है
बस इस निर्भरता को जोड़ें और आप जाने के लिए अच्छे हैं।
compile 'com.balsikandar.android:crashreporter:1.0.1'
डिवाइस में स्थानीय रूप से अपने सभी क्रैश ढूंढें और उन्हें अपनी सुविधानुसार ठीक करें। ट्रैक करने के लिए आसान दिनांक और समय प्रारूप का उपयोग करके दुर्घटनाओं को बचाया जाता है। साथ ही यह कैप्चर के लिए एपीआई प्रदान करता है।
CrashRepoter.logException(Exception e)
आप लाइब्रेरी क्रैशकैचर का भी उपयोग कर सकते हैं
यदि आप बस अपने फोन से कंप्यूटर से कनेक्ट होने के दौरान क्रैश लॉग की तलाश कर रहे हैं, तो ग्रहण में DDMS दृश्य का उपयोग करें और डीडीएमएस के भीतर लॉगकैट में रिपोर्ट सही है जब आपका ऐप डीबग करते समय क्रैश हो जाता है।
1) USB के माध्यम से फोन में प्लग (w / डेवलपर डिबगिंग विकल्प सक्षम)
2) अपने Android SDK के लिए टर्मिनल खोलें और नेविगेट करें (Mac के लिए):
cd ~/Library/Android/sdk/platform-tools
3) लॉग (मैक के लिए) की एक निरंतर प्रवाह उत्पन्न करने के लिए उस निर्देशिका (अपने टर्मिनल में) से लॉगकाट:
./adb logcat
4) क्रैश लॉग जेनरेट करने के लिए अपना ऐप खोलें
5) Ctrl + C टर्मिनल को बंद करने और क्रैश होने वाले ऐप से जुड़े लॉग को देखने के लिए। यह निम्नलिखित जैसा कुछ कह सकता है:
AndroidRuntime: FATAL EXCEPTION: main
इस POST के आधार पर , "TopExceptionHandler" के प्रतिस्थापन के रूप में इस वर्ग का उपयोग करें
class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
private String line;
public TopExceptionHandler(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.app = app;
}
public void uncaughtException(Thread t, Throwable e) {
StackTraceElement[] arr = e.getStackTrace();
String report = e.toString()+"\n\n";
report += "--------- Stack trace ---------\n\n";
for (int i=0; i<arr.length; i++) {
report += " "+arr[i].toString()+"\n";
}
report += "-------------------------------\n\n";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if(cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i=0; i<arr.length; i++) {
report += " "+arr[i].toString()+"\n";
}
}
report += "-------------------------------\n\n";
try {
FileOutputStream trace = app.openFileOutput("stack.trace",
Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"kevineyni@gmail.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "crash report azar");
String body = "Mail this to kevineyni@gmail.com: " + "\n" + trace + "\n";
i.putExtra(Intent.EXTRA_TEXT , body);
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
// Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
// ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));
//ReaderScopeActivity.this.deleteFile("stack.trace");
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
private void startActivity(Intent chooser) {
}
}
.....
उसी जावा क्लास फ़ाइल (गतिविधि) में .....
Public class MainActivity.....
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
.....
Android से कारश लॉग ऐप आज़माएं।
ऐप डाउनलोड करने के लिए लिंक का उपयोग करें ।