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

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

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

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

Triggered ANR

תג Triggered ANR מתווסף לשרשור שנחסם במשך זמן רב מדי וגרם ל-ANR.

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

Deadlocked

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

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

המלצה

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

IO Root blocking

כל thread שהפעיל פעולות קלט/פלט איטיות וחסם את ה-thread‏ Triggered ANR יסומן בתג IO Root blocking. אם השרשור Triggered ANR לא חסום על ידי שרשורים אחרים, גם השרשור IO Root blocking הוא שרשור ב-Root blocking.

המלצה

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

Root blocking

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

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

המלצה

צמצום העבודה שמחייבת שימוש אינטנסיבי במעבד בשרשור הראשי. שימוש בשרתי עבודה או בשרתי רקע לביצוע משימות שמתבצעות בסיוע מעבד.

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

Unknown root cause

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

המלצה

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