אתגר

DadleFish

New member
אתגר ../images/Emo13.gif

אני מחפש את הדרכים הכי חכמות/יעילות/מוצלחות לזיהוי DEADLOCK-ים באפליקציית JAVA - ויותר מדויק, מי גורם להם בדיוק. עד כה, הרעיון שלי מתבסס על MANAGER שאוסף מידע על בלוקים של synchronized על ידי שתי פונקציות - startSync ו-endSync, שבהן מועבר מידע לגבי הסינכרוניזציה. ככה אפשר לעקוב אחרי המתרחש, ובהינתן DEADLOCK ניתן להדפיס מידע זה ללוג. עוד רעיונות?
 

DNile

New member
יש שם כלי בשם windview,

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

voguemaster

New member
per thread logging

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

DadleFish

New member
זה לא מספיק טוב.

יש לנו PER THREAD LOGGING ולמעשה יש לנו LOG ממש, ממש מוצלח. למרות זאת למצוא DL דרך ה-LOG זה למצוא מחט שנכנסה לתחת. בגלל זה אני רוצה להוסיף מידע שיהיה זמין בפשטות. בפרויקט הקודם שלי, ++C, עטפתי את כל ה-synchronization object ב-wrapper-ים שתיעדו כל פעילות כזו, ואז בלחיצת כפתור היית מקבל דו"ח מפורט על כל thread, על כל מה שהוא צורך, על DL אם יש, וכו'. זה היה מצוין. הבעיה היא שב-JAVA אין כזה דבר, ואי אפשר לעשות כזה דבר, כי אי אפשר "להשתמש ב-API אחר" כדי לעשות סינכרון - חייבים להשתמש ב-synchronized המסריח הזה שאי אפשר לעטוף אותו בכלום. אם זה לא מספיק, אז אי אפשר להשתמש בטריק של ה-stack וליצור אובייקט שמתחסל ביציאה מהפונקציה (ואז הייתי יכול ליצור אובייקט "מדווח" על כניסה לסינכרון, וביציאה מהפונקציה הוא היה מושמד ומדווח בדרך על יציאה מסינכרון). בקיצור, דרעק ה-JAVA הזו
יש רעיונות טובים?
 

voguemaster

New member
לא דיברתי על LOG כללי

דיברתי על LOG מיוחד עבור אירועים כמו נעילות של איזורים מסונכרנים. ה-WRAPPERים שכתבת לא ייראו באותה צורה בג'אווה אבל לכתוב אותם ? למה שתהיה לך בעיה עם זה ? מה קשה במיוחד בלבצע LOGGING למתי THREAD מסוים נועל קטע מסונכרן ?
 

DadleFish

New member
בוא נדבר על זה.

ותסלח לי אם אני סוחב ל-C, זה מה שאני מכיר הכי טוב. ב-MUTEX יש לך CreateMutex ליצירה, WaitForSingleObject לנעילה ו-ReleaseMutex לשחרור. הפכתי את זה ל-CMutex עם פונקציית Lock ופונקציית Unlock. מן הסתם, בתוך הפונקציה אני יכול לעשות כעת דברים נוספים. איך תעשה את זה ב-JAVA?
 

RBA

New member
שמעת על JPROB ?

כלי ניטור מצויין שיכול לענות לך על הבעייה.
 

DadleFish

New member
שמעתי, אני לא מכיר אותו לעומק.

מה אתה יכול לספר עליו? מה ההשפעה שלו על ביצועי המערכת? האם אפשר להיכנס איתו AD HOC לתוך JVM שרץ, או שצריך להריץ את המערכת איתו מראש(לא טוב)? אני צריך קודם כל יכולת לזהות את הדברים האלו בצורה מבצעית, בשטח. בדיקות בזמן DEBUG הן פריבילגיה, אבל הבעיות האמיתיות צצות בשטח, בדברים שלא כיסינו (מן הסתם). בגלל זה רוב הכלים החיצוניים לא יתאימו למטרה הספציפית שלי. למרות זאת אפשר לבדוק אותו - אולי הוא יעזור פה ב-DEBUG.
 

gmorph

New member
אתה חושב שיש דברים כאלה?

אם אני מבין נכון, יש לך מערכת מבצעית שרצה בשטח, בגירסאת RELEASE כמובן.אתה רוצה משהו שידע לזהות לך בעיות נעילה למיניהם בזמן ריצה כשהוא לא חלק מהמערכת עצמה והוא לא משפיע יותר מידי על הביצועים.נשמע יומרני במקצת לא?הדבר היחיד שאני יכול לחשוב עליו זה משהו שעוקב מבחוץ אחרי הthreads שרצים וגם יודע מי מנסה לנעול מה ומתי איך ולמה... זה מה שאתה מתכוון?
 

RBA

New member
בוקר טוב.

הכלי בעצם מאזין ל-JVM.(כמובן שמוסיפים עוד פרמטרים לשורת ההרצה). ביצועים - לא יודע. למעשה הוא מעין listener ל-JVM והוא חזק מאד ביכולת לניטור memory leaks,multi threads(rc, dl etc...) יש לו tutorial נחמד. לא נראה לי שתהייה לכם בעייה להשתמש בו במערכת שרצה. בסך הכל מוסיפים עוד כמה פרמטרים ל CLASSPATH ומריצים את JVM. ב J PROBE פשוא מכוונים אותו על PORT שה JVM רץ ואז מתחילה העבודה המעניינת: יש לדלי 2 יכולות מאד חזקות: memory leaks and threads, לדעתי הוא ייתן לכם מענה טוב. כמובן שלא התעסקתי אם כל רבדי האפליקצייה אז זה קצת על קצה המזלג. בהצלחה, רוי. ל
 
למעלה