《אותו בור, למה אפשר ליפול שלוש פעמים?——תיעוד תיקונים חוזרים של zidongjiexi (עם לקחים מערכתיים)》
יש באגים שהם כמו גיל ההתבגרות: אתה חושב שזה עבר, ואז זה חוזר עם תספורת חדשה.
התקלה הפעם ב־astrbot_plugin_zidongjiexiplusyoutubexiazaiהיא דוגמה קלאסית: זה נראה שכל פעם “תיקנו”, אבל אחרי האתחול הבא זה שוב מתהפך。
א. ציר זמן של התקרית: מ"שגיאת PIL" עד “תאימות סביבה”
שלב 1: השגיאה הראשונה (קריסה בטעינת משאבים)
בעת אתחול התוסף, ב־render.py בנקודה _load_video_button הופעל:
img.convert("RGBA")AssertionErrorפנימי של Pillow
מסקנה אינטואיטיבית: יש סיכון חבוי בפענוח המשאב media_button.png (יכול להיות שהתמונה חריגה, או שיש הבדלים במסלול הפענוח בזמן ריצה).
שלב 2: התיקון הראשון (נראה שהצליח)
בוצעה שמירה מחדש של המשאב (RGBA), ולאחר מכן האתחול המיידי עבד.
מכאן קל להסיק ש"בעיה נפתרה".
שלב 3: הישנות (קריסה שוב באותו המקום)
לאחר אתחולים נוספים זה שוב נפל. זה מראה שהבעיה אינה רק “קובץ שהתקלקל פעם אחת”, אלא:
- לנתיב הקוד עצמו חסרה עמידות לתקלות;
- התוסף, במצבי ריצה שונים, עדיין עלול להפעיל כשל פענוח דומה.
שלב 4: בתיקון השני הופיעו “בעיות חדשות שהוכנסו בתיקון”
בעת יישום פאץ’ הופיעו שני סוגים של תקריות משניות קלאסיות:
- הוכנסה שגיאה ברמת תחביר (טיפול לא נכון בהערות/מחרוזות) שהובילה ל־
SyntaxError; - הבדלי גרסאות בספריות הסביבה גרמו לחוסר תאימות בפרמטרים של
EmojiCDNSource(הפרמטרenable_tqdmאינו נתמך).
בסוף, באמצעות חזרה לקובץ יציב + שינוי אינקרמנטלי מינימלי + בדיקת קומפילציה + אימות אתחול מחדש הבעיה התכנסה.
ב. ניתוח שורש: למה “תיקנו ועדיין זה יכול להישבר”
1) “הצלחה חד־פעמית” אינה “תיקון מערכתי”
שמירה מחדש של תמונה פגומה רק מסירה את הדוגמה הנוכחית, ולא מבטיחה שהנתיב עצמו לא יופעל שוב בעתיד.
2) לקוד התוסף חסרה אסטרטגיית דגרדציה למשאבים קריטיים
משאבים הם תלות חיצונית. תלות חיצונית צריכה להיות “מותר לה להיכשל, אבל לא קטלני”.
3) סביבת הריצה אינה קבועה
אותו תוסף, בתמונות קונטיינר שונות ובגרסאות תלות שונות, עשוי להתנהג אחרת באתחול.
לדוגמה, הפעם פער תאימות הפרמטרים של apilmoji אינו שגיאה בלוגיקה העסקית, אלא צימוד לגרסאות האקוסיסטם.
4) בתהליך התיקון חסר “שער אילוצים קשיח”
כשלא מבצעים מיד אחרי כל פאץ’ את הבדיקות הכפויות הבאות, קל להחזיר מצב “רץ” למצב “שגיאת תחביר”:
- בדיקת תחביר
py_compile - אימות אתחול קר (מינימלי)
- אסרט של לוגי טעינת תוסף קריטיים
ג. מה כלל התיקון הסופי הפעם
zidongjiexi
- הוספת לוגיקת עמידות ל־
_load_video_button:img.load()כדי לאלץ פענוח מוקדם;- במקרה חריגה—דגרדציה לתמונת מציין־מקום שקופה, כדי למנוע כשל באתחול התוסף כולו.
- הסרת הפרמטר הבלתי תואם
enable_tqdmמ־EmojiCDNSource, להתאמה לסביבת הריצה הנוכחית. - אימות בכמה מחזורי אתחול מחדש, כדי לוודא שהתוסף נכנס באופן יציב למצב “נטען”.
memelite (על הדרך)
- תיקון היעדר
libEGL.so.1: התקנתlibegl1/libgl1, כדי לבטל לולאת שחזור התלויות בשלב האתחול.
ד. למה זמן האתחול הפעם קפץ מ־20 שניות ל־600+ שניות
זו לא “המערכת פתאום נהייתה איטית”, אלא שבשרשרת האתחול נוספו פריטים חוסמים:
memeliteמשחזר תלות שוב ושוב + תהליך pip שמאריך את האתחול;- כישלונות טעינה חוזרים של תוספים מגדילים את זמן האתחול הכולל;
- סערת לוגים של שגיאות (כולל חריגות בפורמט לוג של צד־שלישי) מגדילה עוד יותר את תחושת התקיעות.
בגרסה בשפת בני אדם: AstrBot לא הזדקן בן לילה—הוא פשוט מתלבש תוך כדי שהוא מתקן פנצ’ר.
ה. לקחים הנדסיים (ששווים יותר מתיקון באג)
לקח 1: טעינת משאבים חייבת להיות “כישלון־בר־הישרדות”
תמונות, פונטים, CDN חיצוני, קובצי Cookie… אי אפשר להניח שהם תמיד תקינים.
עמידות + דגרדציה הם קו הבסיס לתחזוקתיות של תוסף.
לקח 2: תיקון צריך ללכת ב"סגירה במעגל עם שינוי מינימלי"
תהליך מומלץ וקבוע:
- קודם לחזור לבייסליין יציב ידוע;
- לשנות רק נקודה אחת;
- לבצע בדיקת תחביר/בדיקת נקודה;
- לאתחל ולאמת;
- רק אז לשנות את הנקודה הבאה.
לקח 3: “תוקן פעם אחת” חייב לכלול אימות בר־שחזור
“לי זה עובד” לא משמעותי; חייבים שיישאר תקין גם אחרי אתחול, וגם לאורך זמן.
לקח 4: בכתיבת לוגים צריך להיזהר מצימוד לפורמט גלובלי
כששדות לוג של ספריית צד־שלישי לא תואמים לפורמט הלוג של המערכת שלך, זה עלול ליצור רעש ואף לפגוע באבחון.
אפשר לשקול לתת ל־logger של צד־שלישי handler נפרד, או להוריד את רמת הלוג.
ו. המלצות להמשך (כדי למנוע הצגה חוזרת בפעם הבאה)
- להוסיף לתוסף פקודת בדיקה־עצמית באתחול (בדיקת קובצי משאבים, גרסאות תלות, קונפיג קריטי);
- להוסיף ב־CI או בסקריפט שחרור:
- בדיקת תחביר
- בדיקת import מינימלית
- smoke test לפונקציות אתחול קריטיות
- לאמץ אסטרטגיית דגרדציה אחידה לכל “משאבי לא־ליבה”;
- להקים “סף התרעה לזמן אתחול” (למשל
>90sהתראה) ולתפוס אוטומטית לוגים של נקודות איטיות.
סיכום
הדבר הכי בעל ערך בתקרית הזו אינו “סוף סוף זה תוקן”, אלא שאישרנו ש:
- תיקון שבאמת ניתן למסירה אינו כיבוי שריפות ידני חד־פעמי;
- אלא להפוך את המערכת מ"עולה עם מזל" ל"עולה בצורה צפויה".
אם באגים באים לגבות מס IQ, אז לפחות הפעם שמרנו את החשבונית.![]()