অ্যান্ড্রয়েড ক্র্যাশ লগগুলি কীভাবে পাবেন?


155

আমার কাছে এমন একটি অ্যাপ রয়েছে যা বাজারের জায়গায় নেই (একটি ডিবাগ শংসাপত্রের সাথে স্বাক্ষরিত) তবে আমার অ্যাপ্লিকেশনটি ক্র্যাশ হয়ে গেলে ক্র্যাশ লগ ডেটা পেতে চাই। আমার অ্যাপটি কেন ক্র্যাশ হয়েছে তার লগ আমি কোথায় পাব?

উত্তর:


139

যদি আপনার অ্যাপ্লিকেশনটি অন্য লোকেদের দ্বারা ডাউনলোড করা হচ্ছে এবং দূরবর্তী ডিভাইসগুলিতে ক্রাশ হচ্ছে, আপনি একটি অ্যান্ড্রয়েড ত্রুটি রিপোর্টিং লাইব্রেরিটি দেখতে চাইতে পারেন ( এই এসও পোস্টে রেফারেন্স করা )। যদি এটি কেবলমাত্র আপনার নিজস্ব ডিভাইসে LogCat. থাকে তবে আপনি ব্যবহার করতে পারেন এমনকি ক্র্যাশ হওয়ার সময় ডিভাইসটি কোনও হোস্ট মেশিনের সাথে সংযুক্ত না থাকলেও, ডিভাইসটি সংযুক্ত করে এবং একটি adb logcatআদেশ জারি করা পুরো লগক্যাট ইতিহাসটি ডাউনলোড করবে (কমপক্ষে তার পরিমাণে বাফার করা হয় যা সাধারণত লগ ডেটার লূট হয়, এটি কেবল অসীম নয়)। এই বিকল্পগুলির মধ্যে কোনওটিই কি আপনার প্রশ্নের উত্তর দেয়? না পারলে আপনি কী আরও কিছুটা সন্ধান করছেন তা স্পষ্ট করার চেষ্টা করতে পারবেন না?


2
আপনি কীভাবে অ্যাডবি লগক্যাট কমান্ড ব্যবহার করবেন তা বিশদ করতে পারেন? আমি কি এটি / SDK / সরঞ্জাম ডিরেক্টরিতে চালাচ্ছি? আমার কি কোন পতাকা লক্ষ্য করা উচিত? ইত্যাদি
jesses.co.tt

2
@ jesses.co.tt হ্যাঁ, ঠিক adb logcatযে কোনও ডিরেক্টরি অ্যাডবিতে রয়েছে তা থেকে চালান ternative বিকল্পভাবে আপনি একটিগ্রাহী প্লাগইনে অন্তর্ভুক্ত SDK সরঞ্জামগুলি ব্যবহার করতে পারেন
ক্রিস থম্পসন

2
ক্র্যাশলাইটিক্স হ'ল আমি এখন পর্যন্ত ব্যবহার করা সেরা রিমোট ব্যতিক্রম লগিং সফ্টওয়্যার। এটি আমার সমস্ত অ্যাপ্লিকেশনগুলিতে যায়, এটি পরীক্ষা করে দেখুন।
জ্যাকসনকর

adb.exe অবস্থিত $SDK_DIR/platform-tools/। ত্রুটি দেখাতে:.\adb.exe logcat -v time *:E
হারুন

53

পথ এই কাজ করতে বাস্তবায়ন হয় 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");

অথবা আপনি এসিআরএর ত্রুটি প্রতিবেদন করার সিস্টেমটিও ব্যবহার করতে পারেন ust কেবল আপনার প্রকল্পের লিবিতে ACRA.jar অন্তর্ভুক্ত করুন এবং আপনার লঞ্চের ক্রিয়াকলাপ শ্রেণীর ঘোষণার আগে নীচের কোড স্নিপেট ব্যবহার করুন

@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT) 

অথবা আপনি কনসোল থেকে এটি চেষ্টা করতে পারেন: -

adb logcat -b crash 

লাইন ডিফল্ট হবে না WHH.uncaughtException (t, e); পদ্ধতিটিকে অবিচ্ছিন্নভাবে কল্পনা করুন ()?
মিকেল বার্গারন নরন

@ মিকেলবার্গারন ন্যারন নং - এটি কেবলমাত্র থ্রোয়েবলকে শীর্ষ স্তরের হ্যান্ডলারে স্থানান্তরিত করবে।
ফর্ম্যাটবিসিই


36

আপনি কনসোল থেকে এটি চেষ্টা করতে পারেন:

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.

9

আপনি যদি Eclipse ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে আপনি ডিবাগটি ব্যবহার করেছেন এবং না চালাচ্ছেন। আপনি ডিবাগের দৃষ্টিভঙ্গিতে রয়েছেন তা নিশ্চিত করুন (উপরের ডানদিকে) লগ প্রিন্ট করার জন্য আপনাকে কয়েকবার 'রেজ্যুম' (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)

তারা আমাদের জানান যে এটি অনক্রিট পদ্ধতিতে মেইনজাজা-এর 13 লাইনে সীমানা ব্যতিক্রমের একটি অ্যারে ছিল।


9

আপনি Apphance ব্যবহার করতে পারেন। এটি একটি ক্রস-প্ল্যাটফর্ম পরিষেবা (বর্তমানে মূলত অ্যান্ড্রয়েড, তাদের পথে অন্যান্য প্ল্যাটফর্ম সহ আইওএস) যা কোনও মোবাইল ডিভাইস (অ্যান্ড্রয়েড, আইওএস এখন - উন্নয়নের অধীনে থাকা) রিমোটলি ডিবাগ করতে দেয়। এটি কেবল একটি ক্র্যাশলগের চেয়ে অনেক বেশি, বাস্তবে এটি অনেক বেশি: লগিং, পরীক্ষকগণ দ্বারা ক্র্যাশলগগুলির সমস্যার প্রতিবেদন। এটি সংহত করতে প্রায় 5 মিনিট সময় নেয়। বর্তমানে আপনি বদ্ধ বিটাতে অ্যাক্সেসের জন্য অনুরোধ করতে পারেন।

দাবি অস্বীকার: আমি পলিডিয়ার সিটিও, এটি অ্যাফেন্সের পিছনে একটি সংস্থা এবং এর সহ-স্রষ্টা।

আপডেট: Apphance আর বন্ধ বিটা! আপডেট 2: http://applause.com অফার অংশ হিসাবে Apphance উপলব্ধ


2
আমি কেবল উন্নত করার চেষ্টা করেছি এবং এটি পছন্দ করি। আপনার অ্যাপ্লিকেশনটিতে অ্যাবান্স লিবকে সংহত করার সময় ডক্স একটি মূল পয়েন্ট মিস করেছে; এক্সিলিপ এডিটির সর্বশেষতম সংস্করণ সহ, আপনার এই এসও উত্তরটি ব্যাখ্যা করার সাথে সাথে আপনাকে অ্যাপেনস.জারকে libsডিরেক্টরিতে রাখতে হবে । এই গিথুব প্রতিশ্রুতিটি আমার ওয়ার্ল্ডম্যাপ অ্যাপ্লিকেশনটিকে বাড়ানোর জন্য আমার প্রয়োজনীয় পরিবর্তনগুলি দেখায়।
জনিলম্বদা

আপনার মতামত জন্য ধন্যবাদ। এই পরিষ্কার করার জন্য আমরা ডকুমেন্টেশন আপডেট করেছি।
পাইওটার দুদা

12
এটি বেশিরভাগ
বর্ধিত

এই মন্তব্যটির তারিখে অ্যাফ্যানস 404।
ডেভপি

সঠিক। এটি ইউটিস্টের দ্বারা ইতিমধ্যে প্রচুর পরিমাণে আগে এসেছিল যা তাদের পুরো অফারটিকে (অ্যাফান্সের বৈশিষ্ট্য সহ) সাধুবাদে পুনরায় ব্র্যান্ড করেছে। সুতরাং এখন এটি প্রশংসা
ডট কম

8

ক্র্যাশ লগের জন্য এখানে আরও একটি সমাধান।

অ্যান্ড্রয়েড বাজারে "ক্র্যাশ কালেক্টর" নামে একটি সরঞ্জাম রয়েছে

আরও তথ্যের জন্য নিম্নলিখিত লিঙ্ক চেক করুন

http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html


3
অ্যান্ড্রয়েড 4.1 এবং তার পরে (লগগুলি পড়ার জন্য নতুন অনুমতি) তে কাজ করে না।
বিড়াল

4

আপনি এর থেকে Acra ব্যবহার করতে পারেন এই । আপনার প্রকল্পগুলিতে এই লাইব্রেরিটি অন্তর্ভুক্ত করে এবং এটি কনফিগার করে, আপনি তাদের ক্র্যাশ প্রতিবেদনগুলি (আপনার ইমেল বা জিডোকগুলিতে) পেতে পারেন। আমার অদক্ষ ইংরেজির জন্য আমি দুঃখিত.


4

আপনি যদি কোনও বেসিক ক্র্যাশ রিপোর্টিং সরঞ্জামের সন্ধান করছেন তবে ক্র্যাশলিটিক্স ব্যবহার করে দেখুন

আপনি যদি আরও উন্নত প্রতিবেদনের সরঞ্জাম চান তবে চেকআউট গ্রিফোনেট । এটি কোডের সঠিক লাইনের সাথে সংঘটিত সমস্ত ক্র্যাশগুলি লগ করে দেয় যা স্বয়ংক্রিয় চিহ্নিতকারীদের সাথে ক্র্যাশ ঘটায় যা আপনাকে ব্যবহারকারী ক্র্যাশ করার আগে কী কী পদক্ষেপ নিয়েছিল এবং আরও অনেক কিছু দেখায়।

শুভকামনা!



2

আপনার সমস্ত সমস্যা সমাধানের জন্য আমি এই গ্রন্থাগারটি তৈরি করেছি। ক্র্যাশ রিপোর্টার হ'ল একটি কার্যকর সরঞ্জাম যা আপনার সমস্ত ক্র্যাশগুলি ক্যাপচার করে এবং সেগুলি স্থানীয়ভাবে ডিভাইসে লগ করে

কেবল এই নির্ভরতা যুক্ত করুন এবং আপনি যেতে ভাল।

compile 'com.balsikandar.android:crashreporter:1.0.1'

স্থানীয়ভাবে ডিভাইসে আপনার সমস্ত ক্র্যাশগুলি সন্ধান করুন এবং আপনার সুবিধার্থে এগুলি ঠিক করুন। ক্র্যাশগুলি তারিখ এবং সময় ফর্ম্যাট ট্র্যাক করা সহজ ব্যবহার করে সংরক্ষণ করা হয়। এছাড়াও এটি নীচের পদ্ধতিটি ব্যবহার করে লগড ব্যতিক্রমগুলি ক্যাপচারের জন্য এপিআই সরবরাহ করে।

CrashRepoter.logException(Exception e)

আপনি কোনও ডিভাইসের ক্র্যাশ লগগুলি পেতে জাভা ক্লাসটি কী?
Xenolion

থ্রেড.আউনচাক্ট এক্সেপশনহ্যান্ডলার ইন্টারফেসটি সমস্ত অপ্রচলিত ক্র্যাশগুলি ক্যাপচার করতে ব্যবহৃত হয়। এখানে একই github.com/MindorksOpenSource/CrashReporter/blob/master/… এর বাস্তবায়ন ।
বালি

ঠিক আছে লেমেকে এই পরীক্ষা করে দেখুন ...! ধন্যবাদ
Xenolion

2

এখানে একটি সমাধান যা আপনাকে সমস্ত লগ কোনও পাঠ্য ফাইলে ফেলে দিতে সহায়তা করতে পারে

adb logcat -d > logs.txt


0

আপনার ফোনটি কম্পিউটারের সাথে সংযুক্ত থাকাকালীন আপনি যদি ক্র্যাশ লগটি সন্ধান করে থাকেন তবে Eclipse এ DDMS ভিউটি ব্যবহার করুন এবং ডিবাগিংয়ের সময় আপনার অ্যাপটি ক্র্যাশ হওয়ার সাথে সাথে রিপোর্টটি ডিডিএমএসের মধ্যে লগগেটে রয়েছে।


0

1) USB এর মাধ্যমে ফোনে প্লাগ ইন করুন (ডাব্লু / বিকাশকারী ডিবাগিং বিকল্পগুলি সক্ষম করা হয়েছে)

2) টার্মিনালটি খুলুন এবং আপনার অ্যান্ড্রয়েড এসডিকে (ম্যাকের জন্য) নেভিগেট করুন:

cd ~/Library/Android/sdk/platform-tools

3) লগক্যাটটি সেই ডিরেক্টরি থেকে (আপনার টার্মিনালে) লগের অবিচ্ছিন্ন প্রবাহ তৈরি করতে (ম্যাকের জন্য):

./adb logcat

4) আপনার অ্যাপ্লিকেশনটি খুলুন যা ক্র্যাশ লগগুলি তৈরি করতে ক্র্যাশ হয়

5) টার্মিনাল বন্ধ করতে এবং ক্র্যাশ হওয়া অ্যাপটির সাথে সম্পর্কিত লগগুলি সন্ধান করতে Ctrl + C। এটি নীচের মতো কিছু বলতে পারে:

AndroidRuntime: FATAL EXCEPTION: main


0

এই পোস্টে ভিত্তি করে , এই শীর্ষ শ্রেণিকে "টপ এক্সেপশনহ্যান্ডলার" প্রতিস্থাপন হিসাবে ব্যবহার করুন

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));

.....


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.