none
stock overflow exception RRS feed

  • שאלה

  • שלום לכולם!

    אני כותבת console application שעושה crawling לכמה אתרים במקביל. (שאלתי שאלה נפרדת על אותה אפליקציה לפני כמה ימים..)
    אני מקבלת אחרי כמה זמן פעילות (כמה שעות) stockOverflow exception.

    1. משהו יודע אם יש צורה לדבג stockOverflow exception (בדומה לwinDbg לזליגת זכרון)?
    2. קצת קראתי על זה והיה כתוב שכשעושים רקורסיה שרצה "בלי גבול" זה יכול לגרום לstockOverflow, אני קוראת את האתרים ברקורסיה, שמסתיימת ברגע שאין דפים באתר.
    לאתרים גדולים זה יכול להיות גם הרבה מאד קריאות לרקורסיה.

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

    תודה!!!!
    שרה.
    יום חמישי 26 יוני 2014 08:35

תשובות

  • אהלן שרה,

    לגבי ניטור (דיבאג): כבר בגרסת 2.0 נעשו שינויים בטיפול באירועים אלו. ניתן לתפוס אירוע של StackOverflow Exception בעזרת:

    1. ה CLR רץ בסביסה שהוגדרה לאפשר ניהול StackOverflow exceptions

    2. האירוע מופעל ישירות על ידי האפליקציה (זורקים StackOverflow Exception בצורה מכוונת)

    מומלץ לעבור על הקישור קצר הבא:
    http://blogs.msdn.com/b/jaredpar/archive/2008/10/22/when-can-you-catch-a-stackoverflowexception.aspx

    בדוגמה שם מוצג (1) מצב בו אחנו זורקים את ה Exception הזה לבד, (2) מצב של רקורסיה אינסופית שיוצרת את זריקת ה Exception הזה.

    לגבי רקורסיה אינסופית: כמו שמוצג בדוגמה של קישור מעל הרי שהתשובה היא כן :-) רקורסיה אינסופית יכולה ואמורה לזרוק את ה Exception הזה. זה בדיוק המטרה של המחלקה StackOverflowException. בצורה זו נמנעת ריצה אינסופית ותקיעה  של משאבי המחשב. כדאי לקרוא על כך יותר בקישור הבא:
    http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

    לגבי הפתרון:  באחריות המפתח (יותר מדוייק באחריות ארכיטקט הפיתוח) לוודא שמצב כזה לא קורה. לפעמים מגיבילים בצורה קשיחה את מספר הרמות של הרקורסיה, לפעמים אפשר לפצל את הפעולה למספ]ר פעולות מקבילות ועוד.

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

    הרבה?!? כמה זה הרבה
    האם זה נכון לעבוד עם רקורסיה?!? תלוי בצרכים ובמערכת ובפעולות שמבצעים. פעולה על INT לא תהיה זהה לפעולה של עיבוד ועבודה עם שרשרת ארוכה מאוד ...

    יש לנו שליטה חלקית על הדברים כאשר אנחנו מנהלים את ה THREAD שלנו. למשל אפשר לקבוע את הגודל של ה stackSizeInBytes.

    using System.Threading;
    …
    Thread T = new Thread(threadDelegate, stackSizeInBytes);
    T.Start();

    אני חושב שברירת המחדל היא בסביבות 100K אבל לא סגור על זה. אפשר לבדוק לבד בעזרת לולאה ובדיקת המצב בזמן זריקת ה Exception.

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


    [Personal Site] [Blog] [Facebook]signature

    • הוצע כתשובה על-ידי Eran Sharvit יום ראשון 29 יוני 2014 09:21
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 01 יולי 2014 09:26
    שבת 28 יוני 2014 14:03
    מנחה דיון