อาจทำซ้ำการ แก้จุดบกพร่อง Visual Studio Release ใน. NET
อะไรคือความแตกต่างระหว่าง Debug และ Release ใน Visual Studio
อาจทำซ้ำการ แก้จุดบกพร่อง Visual Studio Release ใน. NET
อะไรคือความแตกต่างระหว่าง Debug และ Release ใน Visual Studio
คำตอบ:
สิ่งที่สำคัญที่สุดคือในโหมดดีบักจะไม่มีการปรับให้เหมาะสมขณะที่ในโหมดรีลีสมีการปรับให้เหมาะสม นี่เป็นสิ่งสำคัญเนื่องจากคอมไพเลอร์เป็นขั้นสูงมากและสามารถปรับปรุงโค้ดของคุณในระดับต่ำได้ค่อนข้างยาก ด้วยเหตุนี้โค้ดบางบรรทัดของคุณอาจถูกทิ้งไว้โดยไม่มีคำแนะนำใด ๆ เลยหรือบางบรรทัดอาจปนกันไปหมด การดีบักทีละขั้นตอนจะเป็นไปไม่ได้ นอกจากนี้ตัวแปรในพื้นที่มักจะได้รับการปรับให้เหมาะสมด้วยวิธีที่ลึกลับดังนั้นนาฬิกาและ QuickWatches มักจะไม่ทำงานเนื่องจากตัวแปรถูก "ปรับให้เหมาะสม" และยังมีการเพิ่มประสิทธิภาพอื่น ๆ อีกมากมาย ลองดีบักโค้ด. NET ที่ปรับให้เหมาะสมแล้วคุณจะเห็น
ข้อแตกต่างที่สำคัญอีกประการหนึ่งก็คือด้วยเหตุนี้การตั้งค่ารีลีสเริ่มต้นจึงไม่ต้องกังวลกับการสร้างข้อมูลสัญลักษณ์การดีบักที่กว้างขวาง นั่นคือไฟล์. PDB ที่คุณอาจสังเกตเห็นและช่วยให้ดีบักเกอร์สามารถระบุได้ว่าคำแนะนำในการประกอบใดที่ตอบสนองต่อรหัสบรรทัดใดเป็นต้น
จริงๆแล้ว "Debug" และ "Release" เป็นเพียงป้ายกำกับสองป้ายสำหรับการตั้งค่าทั้งหมดที่อาจส่งผลต่อบิลด์และการดีบักของคุณ
ในโหมด "แก้ไขข้อบกพร่อง" คุณมักจะมีสิ่งต่อไปนี้:
ในการเพิ่มประสิทธิภาพโหมด "Release" จะเปิดอยู่ (แม้ว่าจะมีหลายตัวเลือกให้ใช้งาน) และไม่ได้กำหนดนิยามของตัวประมวลผลล่วงหน้า _DEBUG โดยปกติคุณจะยังคงต้องการสร้างไฟล์ PDB เนื่องจากมีประโยชน์อย่างมากที่จะสามารถ "ดีบัก" ในโหมดรีลีสเมื่อสิ่งต่างๆทำงานได้เร็วขึ้น
โดยส่วนใหญ่การดีบักจะมีข้อมูลพิเศษมากมายที่เป็นประโยชน์เมื่อทำการดีบัก ในโหมดรีลีสทั้งหมดนี้ถูกตัดและแลกเปลี่ยนเพื่อประสิทธิภาพ
หากคุณใช้ตัวเลือกการคอมไพล์โครงการและเปรียบเทียบคุณจะเห็นว่าอะไรคือความแตกต่าง
สมมติว่าคำถามเกี่ยวกับรหัสดั้งเดิม / C ++ (ยังไม่ชัดเจนจากการใช้วลี):
โดยทั่วไปใน Debug การเพิ่มประสิทธิภาพการสร้างโค้ดทั้งหมดจะปิดอยู่ ไลบรารีบางตัว (เช่นSTL ) เริ่มต้นในการตรวจสอบข้อผิดพลาดที่เข้มงวดขึ้น (เช่นตัวทำซ้ำดีบัก) มีการสร้างข้อมูลการแก้ไขจุดบกพร่องเพิ่มเติม (เช่นสำหรับ "แก้ไขและดำเนินการต่อ") มีการสร้างสิ่งต่างๆมากขึ้นในโค้ดเพื่อตรวจจับข้อผิดพลาด (ค่าตัวแปรโลคัลถูกตั้งค่าเป็นรูปแบบที่ไม่ได้กำหนดค่าเริ่มต้นและใช้ฮีปดีบัก)
นอกจากนี้เห็นได้ชัดว่าโหมดดีบักจะสร้างเธรดพิเศษจำนวนมากเพื่อช่วยในการดีบัก สิ่งเหล่านี้ยังคงใช้งานได้ตลอดอายุของกระบวนการไม่ว่าคุณจะแนบดีบักเกอร์หรือไม่ก็ตาม ดูคำถามที่เกี่ยวข้องของฉันที่นี่
อาจเป็นเรื่องที่ควรค่าแก่การกล่าวถึงสิ่งที่ชัดเจนมากว่าการสร้างแฟล็กอนุญาตให้ใช้ตรรกะที่แตกต่างกันซึ่งควรใช้เพื่อเปลี่ยนการบันทึกและการส่งข้อความ "คอนโซล" แต่สามารถใช้ในทางที่ผิดและเปลี่ยนแปลงได้อย่างมากไม่เพียง แต่ในระดับต่ำเท่านั้น แต่ยังรวมถึงตรรกะทางธุรกิจที่แท้จริงด้วย
โปรดทราบว่าเมื่อใช้MFCตัวอย่างเช่นโครงการดีบักจะเชื่อมโยงกับเวอร์ชัน DLL ที่ไม่สามารถแจกจ่ายต่อได้เช่นMFC90D.DLL
ในขณะที่รุ่นสร้างลิงก์กับเวอร์ชันที่แจกจ่ายต่อได้เช่นMFC90.DLL
. ซึ่งอาจคล้ายกับกรอบอื่น ๆ
ดังนั้นคุณอาจไม่สามารถเรียกใช้แอปพลิเคชันการดีบักบนเครื่องที่ไม่ได้พัฒนา
ฉันก็อยากรู้คำถามนี้เช่นกันเมื่อฉันได้พัฒนาแอปพลิเคชันที่คัดลอกมาจากการกำหนดค่าการสร้างรุ่นที่มีอยู่
ฉันมีนักพัฒนาที่น่าสนใจในการใช้แอปพลิเคชันนั้นในโหมดดีบักดังนั้นฉันจึงสงสัยว่าจะต้องใช้อะไรบ้างในการสร้างการกำหนดค่าการสร้างนี้ที่มีอยู่ในชื่อของ ReleaseMyBuild ที่คัดลอกมาจากการกำหนดค่ารุ่น (ดังนั้นจึงควรมีการตั้งค่าทั้งหมดเพื่อเผยแพร่การเพิ่มประสิทธิภาพ ) เพื่อเปลี่ยนทีมอย่างกะทันหันและกลายเป็นบิวด์ดีบักแม้จะมีชื่อคอนฟิกูเรชันบิลด์ที่สับสน
ฉันคิดว่าการกำหนดค่าโครงการเป็นเพียงชื่อและวิธีที่สะดวกในการเลือก "การตั้งค่าทั้งหมด" ที่ Joris Timmermans กล่าวถึง ฉันอยากจะรู้ว่าสารัตถะเพียงการตั้งค่าสิ่งเหล่านั้นอาจเป็นไปได้ว่าจะทำให้การกำหนดค่าการสร้างชื่อ "ฟู" ฟังก์ชั่นเป็นที่ดีที่สุดการเปิดตัวสร้าง
นี่เป็นแวบเดียว ฉันสร้าง VCXPROJ ใหม่จากเทมเพลตโปรเจ็กต์ว่างจาก Visual Studio 2010 จากนั้นฉันก็คัดลอกและแก้ไขทั้งสองอย่างแรกเพื่อเก็บเนื้อหาการดีบักและเนื้อหาที่สองของรีลีส นี่คือความแตกต่างที่เน้นความแตกต่างที่เกี่ยวข้อง ...
ปล่อย
<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
แก้ปัญหา
<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`
<ClCompile>
<Optimization>Disabled</Optimization>
เป็นที่น่าสนใจที่ในส่วนลิงก์ทั้งสองได้GenerateDebugInformation
ตั้งค่าเป็นจริง
ความแตกต่างที่เห็นได้ชัดคือขนาดของไบนารี รุ่น Debug สร้างไบนารีที่ใหญ่กว่ารุ่น Release
เมื่อคอมไพล์ใน Debug ตารางสัญลักษณ์จะถูกเพิ่มลงในอ็อบเจ็กต์ที่คอมไพล์แล้วของไฟล์โค้ดซึ่งช่วยให้โปรแกรมดีบั๊กแตะลงในไบนารีเหล่านี้และเข้าถึงค่าของอ็อบเจ็กต์และตัวแปร
ความแตกต่างที่สังเกตได้อีกประการหนึ่งคือในโหมดรีลีสไบนารีจะขัดข้องกับข้อผิดพลาดร้ายแรงขณะอยู่ในโหมดดีบักหากคุณเริ่มการดีบักแอปพลิเคชันใน Visual Studio คุณสามารถตรวจสอบกลุ่มการโทรซึ่งจะบอกตำแหน่งที่แน่นอนของคำสั่งที่ผิดพลาด .
ฉันไม่รู้ว่าความแตกต่างที่แน่นอนคืออะไรเพราะจริงๆแล้วไม่มีข้อมูลเกี่ยวกับเรื่องนี้
แต่ความแตกต่างที่สังเกตได้หลัก ๆ ก็คือบางครั้งเวอร์ชันที่วางจำหน่ายจะทำให้ไฟล์ DLL เสียหายและทำให้แอปพลิเคชันของคุณใช้งานไม่ได้
น่าเศร้าที่คุณต้องใส่ debug build ในการผลิต และใช่ในการเผยแพร่คุณต้องใช้ FTP เก่าที่ดี