ניפוי באגים בנושא פגיעה בזיכרון באמצעות כלי לחיטוי כתובות

במסמך הזה נסביר איך להפעיל כלים מיוחדים לניפוי באגים בזמן השימוש AGDE. הכלים האלה יכולים לעזור לך לפתור בעיות בזיכרון שגיאות והחלפתן.

כלי לחיטוי כתובות וניקוי כתובות ב-HWAddress

HWAddress Sanitizer (HWASan) וכתובת Sanitizer (ASan) הם כלים לניפוי באגים במקרים של פגיעה בזיכרון לניפוי באגים ולתיקון שגיאות בזיכרון, כמו הבאים:

  • גלישה במאגר הנתונים הזמני של הערימה וזרימה של פחות נתונים
  • מאגר נתונים זמני של ערימה חורג מסטרימינג
  • מקבץ שימושים מחוץ להיקף שלו
  • שגיאות כפולות חופשיות וחינמיות
  • שימוש בערימה לאחר החזרה (HWASan בלבד)

מומלץ להפעיל את HWASan או ASan רק במהלך ניפוי באגים של בעיה, או חלק מהבדיקות האוטומטיות. אומנם הכלים האלה יש ביצועים טובים, אבל עלול לגרור עונש.

התנהגות בזמן ריצה

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

אם מזוהה שגיאת זיכרון, האפליקציה קורסת עם SIGBART (האות מתבטל) ומדפיסה הודעה מפורטת ל-Logcat. עותק של ההודעה נכתב גם לקובץ בשם /data/tombstones.

הודעת השגיאה נראית דומה לזו:

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

דרישות מוקדמות

התקנת גרסת build של HWASan במערכת ההפעלה Android

כדי להשתמש ב-HWASan, פועלים לפי הוראות ההגדרה מסמכי תיעוד של HWASan להתקנת גרסת build של HWASan במערכת ההפעלה Android עבור Google מכשירי Pixel

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

שימוש בספרייה הרגילה של C++ בפרויקט

בגלל בעיה ידועה, ASan לא תואמת לטיפול בחריגות C++ כאשר באמצעות libc++_static. הבעיה הזו לא מופיעה במהלך השימוש ב-libc++_shared.

ל-HWASan יש הטמעה משלו של האופרטורים new ו-delete, ולכן אי אפשר להשתמש בו אם הספרייה הרגילה מקושרת באופן סטטי לפרויקט.

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

הפעלה של יצירת מצביע על פריימים

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

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

הגדרת שימוש ב-HWASan או ב-ASan בפרויקט Visual Studio

הפעלת HWASan או ASan

כדי להפעיל את HWASan או ASan, עוברים אל מאפייני הגדרה > כללי ב- דפי נכסים של הפרויקט.

תפריט המאפיינים של Visual Studio Solution Explorer
פרויקט.

איור 1: האפשרות מאפיינים של הפרויקט בפתרון Visual Studio חלון חוקר.

תיבת הדו-שיח 'דפי נכס' של הפרויקט שבה מוצגים מאפיינים כלליים, ו- Address
הגדרות החיטוי מודגשות.

איור 2: ההגדרה כלי לחיטוי כתובות (ASan) בפרויקט הכללי נכסים.

כדי להפעיל את HWASan בפרויקט, משנים את הכלי 'ניקוי כתובות' (ASan). הגדרה ל: Hardware ASan Enabled (fsanitize=hwaddress).

כדי להפעיל את ASan בפרויקט, צריך לשנות את ההגדרה ניקוי כתובות (ASan) אל ASan Enabled (fsanitize=address).

הפעלת יצירת מצביע של פריימים

היצירה של מצביע לפריים נקבעת על ידי השמטת מסגרת של מצביע (C/C++ ) את ההגדרה 'מהדר (compiler)'. אפשר למצוא אותה בקטע Property Pages בפרויקט שלכם בקטע מאפייני הגדרה > C/C++ > אופטימיזציה.

בתיבת הדו-שיח Asset Pages של הפרויקט שמוצגת בה מאפייני האופטימיזציה C/C++ .
והשמטת ההגדרות של מצביע הפריים
מודגשת.

איור 3: איפה נמצאת ההגדרה השמטת מצביע של מסגרת.

כשמשתמשים ב-HWASan או ב-ASan, קובעים את ההגדרה Omit Frame Pointer בתור לא (-fno-omit-frame-pointer).

קישור של הספרייה הרגילה של C++ במצב ספרייה משותפת

ניתן למצוא את הגדרת מצב הקישור עבור הספרייה הרגילה של C++ דפי הנכסים של הפרויקט בקטע Configuration Properties > כללי, ב: בקטע Project Defaults (ברירות המחדל של הפרויקט).

תיבת הדו-שיח 'דפי נכס' של הפרויקט שבה נבחרה הקטגוריה 'כללי'.
שימוש בהגדרת STL
מודגשת.

איור 4: איפה נמצאת ההגדרה של מצב מקשר עבור הספרייה הרגילה של C++.

כשמשתמשים ב-HWASan או ב-ASan, יש להגדיר שימוש ב-STL כדי להשתמש בספריות רגילות מסוג C++ (.so). הערך הזה מקשר את C++ את הספרייה הרגילה בפרויקט בתור ספרייה משותפת, שנדרשת HWASan ו-ASan פועלים באופן תקין.

יצירת תצורת build לשימוש בכלי לחיטוי כתובות

אם אתם מעדיפים להשתמש ב-HWASan או ב-ASan באופן זמני, לא בטוח שתרצו ליצור תצורת build חדשה שמיועדת רק לשימוש שלהם. יכול להיות שזה המצב אם הוא קטן, אתם חוקרים את התכונה, או בתגובה לבעיה לגלות במהלך הבדיקה.

עם זאת, אם התוכן עזר לכם ואתם מתכננים להשתמש בו באופן קבוע, כדאי לשקול יצירת תצורת build חדשה עבור HWASan או ASan כפי שמודגם דוגמה לסיר קטן. כדאי לעשות זאת אם, לדוגמה, אתם מפעילים באופן קבוע את הכלי 'ניקוי כתובות' כחלק מבדיקות היחידה, או בדיקות עשן במהלך לילה במשחק.

יצירת תצורת build נפרדת יכולה להיות שימושית במיוחד אם יש פרויקט גדול שצורך מספר גדול של ספריות שונות של צדדים שלישיים שבו בדרך כלל מקשרים אותם באופן סטטי לספרייה הרגילה של C++. ייעודי הגדרות build יכולות לעזור להבטיח שהגדרות הפרויקט יישארו מדויקים תמיד.

כדי ליצור תצורה של build, בדפי הנכס של הפרויקט, לוחצים על ה הלחצן Configuration Manager... (מנהל ההגדרות) ואז פותחים את הגדרת הפתרון הפעיל. בוחרים . ליצור תצורת build חדשה עם שם מתאים (לדוגמה, HWASan) ).