לדלג לתוכן

פתרון סמלים ואופטימיזציה

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

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

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

הפקודות הבאות מדגימות בנייה עם אופטימיזציה מעבר ליחידות תרגום, לאחר שפיצלנו את הקוד ל־symbols.cpp ול־transform.cpp.

cl /nologo /std:c++20 /EHsc /W4 /O2 /GL /Zi /c symbols.cpp transform.cpp
link symbols.obj transform.obj /LTCG /DEBUG /OUT:symbols_ltcg.exe /PDB:symbols_ltcg.pdb

ה־header המשותף צריך להצהיר על unsigned transform(unsigned);, והמימוש צריך להופיע רק ב־transform.cpp. אין להשתמש ב־noinline על transform אם מטרת הניסוי היא לבדוק האם הכלים בוחרים לשלב אותה.

חבילת התחקיר כוללת את ה־image המדויק ואת כל ה־DLLים הפרטיים שנדרשים לו, את ה־PDBים המתאימים, גרסת מקור, גרסת מהדר ו־linker, flags, נתוני PGO אם נעשה בהם שימוש ותיאור סביבת היעד. ה־dump או ה־trace של התקלה נשמרים בנפרד עם זהות הגרסה.

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