אינסטרומנטציה על רגל אחת: קוד מקור, קוד בינארי והשימושים שאולי לא הכרתם

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

האינסטרומנטציה משמשת ביומיום לצורך דיבאג, אבל ממש לא רק (צילום: Pexels)

מאת נפתלי שלו, SW Director of Instrumentation and Simulation

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

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

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

אינסטרומנטציה של קוד מקור – Source Code Instrumentation

בסוג זה של אינסטרומנטציה המפתח מוסיף ידנית או באמצעות כלים אוטומטיים אנוטציות (Annotations) – עיטורים לקוד שמטרתם לעזור בבחינתו.

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

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

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

מצד שני, אינסטרומנטציה של קוד מקור מצריכה מטבעה גישה לקוד המקור ולתהליך בניית התוכנה, דברים שלא תמיד מתאפשרים. כמו כן, התוכנה הממוכשרת (Instrumented Binary) שונה מגרסת ה-release, כך שכמו בפיזיקה קוונטית, עצם המדידה עלול להשפיע על ההתנהגות.

אינסטרומנטציה בינארית – Binary Instrumentation

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

1. אינסטרומנטציה בינארית סטטית (Static Binary Instrumentation) מבוצעת על קוד בינארי כשהוא על הדיסק ולא בזמן ריצה. כלי האינסטרומנטציה יפענח אותו (decoding) ויבצע את האינסטרומנטציה – יוסיף פקודות, יוריד פקודות, ישנה פקודות וכדומה על מנת ליצור את האפקט הרצוי, יקודד מחדש (encoding) על מנת ליצור תוכנה ממוכשרת וישמור אותה על הדיסק.

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

2. אינסטרומנטציה בינארית דינמית (Dynamic Binary Instrumentation) היא השיטה המתקדמת והמורכבת ביותר. בשיטה זו האינסטרומנטציה מבוצעת בזמן הריצה של התוכנית, תוך כדי שימוש במשאבים של התוכנית עצמה.

כדי להסביר את השיטה אתן שתי דוגמאות שכל מפתח מכיר. הראשונה – debugger. כאשר אנחנו מבקשים לשים נקודת עצירה (breakpoint) בכתובת מסוימת, הדיבאגר מחליף את הפקודה שרשומה בכתובת הזו בפקודה אחרת שתעביר את השליטה לדיבאגר עצמו. זו האינסטרומנטציה הדינמית הבסיסית והפשוטה ביותר שיש, אך לפעמים הפשטות משתלמת.

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

אז איך זה עובד? בשיטה זו כלי האינסטרומנטציה שולט לחלוטין בריצת התוכנה ולמעשה משמש כמעין מכונה וירטואלית. הכלי יקרא קטע קוד קטן (code fetch) – הקטע הבא שעומד להתבצע, וכמו בשיטה הסטטית יפענח אותו, יבצע את האינסטרומנטציה ויקודד מחדש. ההבדל הוא שכעת הוא ישים אותו בזיכרון ולא על הדיסק, ובסיום הקטע ישתול גם פקודת קפיצה שתחזיר את השליטה חזרה לכלי האינסטרומנטציה עצמו, וחוזר חלילה.

בצורה זו כלי האינסטרומנטציה תמיד נמצא בשליטה ורואה כל אירוע תוכנתי בזמן הריצה, כגון יצירת חוטים (threads) חדשים, פסיקות מערכת, שגיאות וכן הלאה. היתרונות של שיטה זו על פני השיטה הסטטית הם שניתן בקלות יחסית להתחשב באירועים דינמיים שקורים בזמן הריצה ולבצע אינסטרומנטציה שונה כתגובה. בנוסף, ניתן לבצע אינסטרומנטציה גם לקוד שמיוצר דינמית (JIT code) וכן לכל הספריות שהתוכנה המקורית טוענת באופן דינמי.

לא רק דיבאג

האינסטרומנטציה משמשת אותנו בפיתוח היומיומי לצורך דיבאג, אך השימושים שלה לא מסתכמים בכך. כלי אינסטרומנטציה משמשים לטובת ניתוח ביצועים, מציאת אזורים לא יעילים בתוכנה, מציאת בעיות זיכרון, בעיות multi-threading ועוד. בנוסף, ישנם שימושים רבים בעולם ה-Cyber Security כגון ניתוח התנהגות דינמית, זיהוי malware, הגנה באמצעות sandbox ועוד.

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

הכתבה בחסות Intel

אינטל Software – לא מה שחשבתם.
אינטל ישראל היא המוקד העולמי של מספר צוותי תוכנה באינטל - AI, Data Science, Machine vision, Instrumentation, Connectivity, Security, Compute והינה מרכז הפיתוח הגדול והמגוון ביותר בארץ.
פתרונות המחשוב שלנו נמצאים בכל מקום. ברכב אוטונומי. בענן. מFirmware ל AI . וגם במחשבים. הימצאות כל הדיספלינות בסייטים הישראליים ופורטפוליו המוצרים הרחב מאפשרים ורסטליות ומגוון אפשרויות פיתוח קריירה אינסופיות.
יש כאן הזדמנות להיות חלק מהארגון המשמעותי ביותר עבור אינטל העולמית, שאחראי להתווית האסטרטגיה ולפיתוח מוצרים ופתרונות שמשפיעים על איך ומה שהטכנולוגיה תאפשר בעתיד. בסוף, את המומחיות שלך, את.ה רוצה להביא לחברה שזו מהות העיסוק שלה ומאפשרת לייצר אימפקט גלובאלי אמיתי שתורם למיליוני אנשים ברחבי העולם.
למגוון ההזדמנויות שוברות המוסכמות אצלנו – לחצו כאן



כתב אורח

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

הגב

5 תגובות על "אינסטרומנטציה על רגל אחת: קוד מקור, קוד בינארי והשימושים שאולי לא הכרתם"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 

* היי, אנחנו אוהבים תגובות!
תיקונים, תגובות קוטלות וכמובן תגובות מפרגנות - בכיף.
חופש הביטוי הוא ערך עליון, אבל לא נוכל להשלים עם תגובות שכוללות הסתה, הוצאת דיבה, תגובות שכוללות מידע המפר את תנאי השימוש של Geektime, תגובות שחורגות מהטעם הטוב ותגובות שהן בניגוד לדין. תגובות כאלו יימחקו מייד.

סידור לפי:   חדש | ישן | הכי מדורגים
אחד שעוזר
Guest
אחד שמכיר
Guest

יש גם כלי אינסטרומנטציה דינמית כמו Rookout.com שמאפשרים לעשות את זה בלייב, בלי לכתוב קוד ובלי לפרוס מלא גרסאות לכל שינוי, בלי לעצור את ריצת האפליקצייה…

היי
Guest

אין על דיבוג עם הדפסות

יוסף
Guest

תכלס

אבי
Guest

console.log. צירוף המילים הנכתב ביותר, ולא צריך יותר מזה

wpDiscuz

תגיות לכתבה: