299. Compiler switches

[נכתב ע”י עודד לזר]

אהלן,

עמית שאל אותי היום אם אני יודע איך יודעים אם assembly קומפל בrelease או בdebug ואני חושב שהתשובה שלי תוכל לעזור להרבה אנשים…

למי שלא יודע, debug / release הם בסה”כ אוסף של הגדרות לcompiler (או בלעז: compiler switches) שעוזרים לו להבין איך לקמפל את הassembly לil.

בהגדרה, קימפול ב-debug מבטל את אופטימיזציות של הקומפיילר / JIT ומאפשר edit and continue,

לעומתו, release מפעיל את כל האופטימיזציות (גם אופטמיזציות של הקומפיילר וגם אופטימיזציות בruntime)

חשוב שתדעו שלא חייבים לקמפל את הקוד בdebug\release אלא אפשר ממש לתת לו את הדגלים שאיתם רוצים לקמפל.

בכל מקרה, המידע כיצד קומפל הassembly יושב בmanifest וניתן לגשת אליו דרך il dissassembler:

אם תסתכלו בmanifest, תראו שהוצמד אליו Attribute בשם DebuggubleAttribe שמחזיק enum עם הcompiler switches שהשתמשתם בהם.

הenum נראה ככה:

1
2
3
4
5
6
7
8
public enum DebuggingModes
{
None = 0,
Default = 1,
IgnoreSymbolStoreSequencePoints = 2,
EnableEditAndContinue = 4,
DisableOptimizations = 256,
}

לצערנו אי אפשר לקרוא אותו בקלות דרך הmanifest אז צריך לכתוב קצת קוד שעושה את זה:

1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
{
string filePath = @"d:\demo\debug.exe";
var assembly = Assembly.LoadFile(filePath);
var debuggubleAttributes = (from attribute in assembly.GetCustomAttributes(false)
where attribute is DebuggableAttribute
select attribute as DebuggableAttribute).Single();
Console.WriteLine("IsJITOptimizerDisabled - " + debuggubleAttributes.IsJITOptimizerDisabled);
Console.WriteLine("IsJITTrackingEnabled - " + debuggubleAttributes.IsJITTrackingEnabled);
Console.WriteLine("DebuggableAttributes - " + debuggubleAttributes.DebuggingFlags.ToString());
}

שיהיה יום בדיקת compiler switches מעולה.

שתף