ניפוי באגים באפליקציה ל-Android על סמך תגי ANR במרכז הבקרה של Crashlytics

שגיאות מסוג 'האפליקציה לא מגיבה (ANR)' מופעלות כששרשור ה-UI של האפליקציה לא מגיב במשך יותר מ-5 שניות. מידע נוסף על מקרי ANR ועל אבחון שלהם זמין בתיעוד של Android.

בנוסף, Crashlytics יכול לעזור לכם לזהות שרשורים ספציפיים שגורמים לבעיות. אנחנו מנתחים את מקרי ה-ANR, ואז במרכז הבקרה של Crashlytics אנחנו מתייגים את השרשורים הרלוונטיים כדי לספק רמזים לניפוי באגים של ה-ANR.

בקטעים הבאים בדף הזה מוסבר מה המשמעות של כל תג ANR, מוצגות דוגמאות ל-ANR עם התג הזה ומוצע פתרון מומלץ לניפוי הבאגים של ה-ANR.

Triggered ANR

‫Thread שנחסם למשך זמן ארוך מדי והפעיל את ה-ANR מסומן בתג Triggered ANR.

השרשור הבעייתי יכול להיות השרשור הראשי של האפליקציה, או כל שרשור שלא מגיב. עם זאת, יכול להיות שהשרשור שתויג כ-Triggered ANR הוא הסיבה האמיתית ל-ANR, ויכול להיות שלא. כדי לספק תובנות לניפוי באגים ולתיקון של שגיאות ANR,‏ Crashlytics מתייג גם את כל השרשורים האחרים שקשורים לשגיאת ה-ANR. בקטעים הבאים בדף הזה מוסבר על תגים אחרים שאפשר להוסיף לשרשור.

Deadlocked

כל השרשורים שנמצאו כמעורבים במבוי סתום שהוביל ל-ANR מסומנים בתג Deadlocked.

מצב של קיפאון מתרחש כש-thread נכנס למצב המתנה כי משאב נדרש מוחזק על ידי thread אחר, שגם הוא ממתין למשאב שמוחזק על ידי ה-thread הראשון. אם ה-thread הראשי של האפליקציה נמצא במצב הזה, סביר להניח שיוצגו שגיאות ANR.

המלצה

בודקים את השרשורים שמעורבים במצב הקיפאון ואת המשאבים או הנעילות שהשרשורים האלה קיבלו. כדי לראות פתרונות אפשריים, אפשר לעיין במאמרים בנושא מבוי סתום ואלגוריתמים למניעת מבוי סתום.

IO Root blocking

כל thread שביצע פעולות קלט/פלט (I/O) איטיות וחסימה של ה-thread‏ Triggered ANR מתויג בתג IO Root blocking. אם ה-thread‏ Triggered ANR לא נחסם על ידי threads אחרים, אז ה-thread‏ IO Root blocking הוא גם thread‏ Root blocking.

המלצה

באופן כללי, האפליקציה לא אמורה לבצע פעולות קלט/פלט יקרות ב-thread הראשי. אם ה-thread הראשי הוא IO Root blocking, אפשר גם להשתמש במצב קפדני כדי לזהות פעולות קלט/פלט לא מכוונות שמתבצעות ב-thread הראשי.

Root blocking

כל שרשור שחסם את השרשור שתויג כ-Triggered ANR יתויג בתג Root blocking. אם שרשור מתויג גם ב-Root blocking וגם ב-Triggered ANR, סימן שלא קיימים שרשורים אחרים שחוסמים את השרשור הזה.

אם יש threads של Triggered ANR שנמצאים בהמתנה (אולי באופן טרנזיטיבי) ל-threads אחרים, הם מסומנים ב-Root blocking. יכולות להיות סיבות שונות לכך ששרשור מסוים הוא הגורם העיקרי ל-ANR.

המלצה

צריך לצמצם את העבודה שדורשת הרבה משאבים מהמעבד ב-thread הראשי. שימוש ב-worker או בשרשורים ברקע לביצוע משימות שדורשות הרבה משאבי CPU.

כדאי לצמצם את העבודה שדורשת הרבה פעולות קלט/פלט, כמו טעינה ממסד נתונים, ב-thread הראשי.

Unknown root cause

שרשור מסומן בתג Unknown root cause אם הוא השרשור שהפעיל את ה-ANR אבל היה במצב המתנה בתהליך כשהתרחש ה-ANR. ל-Crashlytics אין מספיק מידע כדי לקבוע את הסיבה הבסיסית. לא ברור למה קרה מקרה ה-ANR הזה.

המלצה

פועלים לפי העצות הכלליות למניעת מקרי ANR. לדוגמה, אפשר לזהות את המקומות בקוד שבהם השרשור הראשי של האפליקציה עשוי להיות עמוס במשך יותר מ-5 שניות.