protect
ถ้าเอาบทความไปเผยแพร่แล้วไม่ให้เครดิต ดำเนินคดีด้วย พรบ. คอมพิวเตอร์ฉบับใหม่ ขั้นสูงสุดและไม่ยอมความครับ
วันพุธที่ 12 สิงหาคม พ.ศ. 2558
Debug VS Release
จากบทความที่แล้วผมได้อธิบายขั้นตอนการ execute โปรแกรมชนิด Managed Code ของ .Net Framework เราจะเห็นว่าขั้นตอน compile code IL ไปเป็น Native CPU ซึ่งจะเริ่มต้นทำตอน execute โปรแกรมอาจจะใช้เวลานาน ดังนั้นการ optimize code จึงเป็นสิ่งที่จำเป็นอย่างยิ่งเมื่อเรา release โปรแกรม เป็น official version.
compiler ในชุดของ .Net Framework มี parameter 2 ตัวสำหรับให้ใช้ compile โปรแกรมที่เรากำลังพัฒนา parameter ทั้งสองตัวนี้ จะช่วย compiler optimize IL code และ Native CPU เพื่อให้การ execute โปรแกรมมีประสิทธิภาพมากที่สุด
parameter ทั้ง 2 ตัวนี้ ได้แก่
1) optimize(+/-)
ด้วยความสามารถของโปรแกรม Visual Studio จะสามารถอนุญาติให้เรา debug โปรแกรมให้ทำงานทีล่ะบรรทัดหรือกระโดดไป execute บรรทัดที่เราต้องการ ก่อนอื่นต้องเข้าใจก่อนว่าช่วงที่เรากำลัง debug โปรแกรมด้วย Visual Studio เป็นการทำงานรวมกันระหว่างภาษา IL กับภาษา Native CPU การทำเช่นนี้ได้ compiler ของ .Net Framework จำเป็นจะต้อง modify IL code โดยใช้ชุดคำสั่ง NOP (Non operation - กรณีการ debug code ที่ละบรรทัด) ยิ่งมาการ set break point มากหรือ run single step (debug code ทีล่ะบรรทัด) มากจำนวนชุดคำสั่ง NOP ใน IL code ก็จะมีมากขึ้นตามไปด้วย
การ debug code ด้วยการกระโดดไปทำงานทีบรรทัดอื่นๆ หรือการกระโดดเข้าไปในชุดคำสั่ง loop เช่น for loop, while loop ตัว compiler ก็จะใส่ชุดคำสั่งที่เรียกว่า branch instruction ลงไปใน IL code เพื่อที่จะให้ Visual Studio สามารถ debug code ได้ถูกต้อง
ตัวอย่างที่เห็นได้ชัดของ branch instruction คือ debug code ของ function ชนิด recursive เช่นตัวอย่าง code ข้างล่างครับ
static void Main(string[] args)
{
Console.WriteLine(Recursive(10).ToString());
Console.ReadLine();
}
static int Recursive(int counter)
{
int nextCounter = counter - 1;
if (counter > 0)
{
return ( counter * Recursive(nextCounter));
}
else
{
return 1;
}
}
ถ้ามีการ set break point ที่คำสั่ง if (counter > 0)ตัว branch instruction จะเป็นตัวบอก Visual Studio ทราบว่าเป็นการ debug function Recursive ของ counter ตัวที่เท่าไร
โดยปกติโปรแกรมที่เราส่งไปให้ลูกค้าไม่จำเป็นต้องมีชุดคำสั่ง NOP และชุดคำสั่ง branch instruction เลย การที่จะบอก compiler ไม่ให้ใส่ชุดคำสั่ง NOP กับ branch instruction ด้วยการใส่ parameter optimize+ ซึ่งจะเป็นการช่วยให้ execute file (file นามสกุล EXE) มีขนาดเล็กลงเพราะไม่มีชุดคำสั่งดังกล่าว
ตอนที่เรา debug code ด้วย Visual Studio ตัว compiler จะถูก compile ด้วย parameter /optimize-
2 debug(full/pdbonly)
การ debug code ของโปรแกรม Visual Studio การใส่ NOP กับ branch instruction ยังไม่สามารถ debug code ได้ ทุกครั้งที่มีการ compile code ตัว compiler จึงได้สร้าง file นามสกุล PDB (Program Database) file PDB จะเป็นตัวเก็บข้อมูลของ address ของ Native code กับ ที่อยู่ของ C# code (ก่อนเป็น IL code)
การ set parameter /debug:full จะเป็นการบอก JIT compiler ให้ compile IL code ในส่วนของ NOP กับ branch instruction ด้วย
การ set parameter /debug:pdbonly จะเป็นการบอก JIT compiler สร้าง file PDB อย่างเดียวและใม่ต้อง compile ชุดคำสั่ง NOP กับ branch instruction และไม่สร้าง DebuggableAttribute นั้นหมายถึงเราจะ debug code ไม่ได้ครับ
file PDB นี้จำเป็นสำหรับ Visual Studio แต่ไม่จำเป็นสำหรับลูกค้า เราไม่จำเป็นต้องใช้ file นี้ลงไปใน official version ครับ
บทสรุป
Visual Studio มี mode สำหรับการ compile code อยู่ 2 mode คือ Debug กับ Release
การ compile code ด้วย mode Debug คือการ set parameter /optimize- กับ /debug:full
การ compile code ด้วย mode Release คือการ set parameter /optimize+ กับ /debug:pdbonly
พบกันใหม่บทความหน้าครับ
TuChay
สมัครสมาชิก:
ส่งความคิดเห็น (Atom)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น