อะไรคือความแตกต่างระหว่าง Debug และ Release ใน Visual Studio


คำตอบ:


114

สิ่งที่สำคัญที่สุดคือในโหมดดีบักจะไม่มีการปรับให้เหมาะสมขณะที่ในโหมดรีลีสมีการปรับให้เหมาะสม นี่เป็นสิ่งสำคัญเนื่องจากคอมไพเลอร์เป็นขั้นสูงมากและสามารถปรับปรุงโค้ดของคุณในระดับต่ำได้ค่อนข้างยาก ด้วยเหตุนี้โค้ดบางบรรทัดของคุณอาจถูกทิ้งไว้โดยไม่มีคำแนะนำใด ๆ เลยหรือบางบรรทัดอาจปนกันไปหมด การดีบักทีละขั้นตอนจะเป็นไปไม่ได้ นอกจากนี้ตัวแปรในพื้นที่มักจะได้รับการปรับให้เหมาะสมด้วยวิธีที่ลึกลับดังนั้นนาฬิกาและ QuickWatches มักจะไม่ทำงานเนื่องจากตัวแปรถูก "ปรับให้เหมาะสม" และยังมีการเพิ่มประสิทธิภาพอื่น ๆ อีกมากมาย ลองดีบักโค้ด. NET ที่ปรับให้เหมาะสมแล้วคุณจะเห็น

ข้อแตกต่างที่สำคัญอีกประการหนึ่งก็คือด้วยเหตุนี้การตั้งค่ารีลีสเริ่มต้นจึงไม่ต้องกังวลกับการสร้างข้อมูลสัญลักษณ์การดีบักที่กว้างขวาง นั่นคือไฟล์. PDB ที่คุณอาจสังเกตเห็นและช่วยให้ดีบักเกอร์สามารถระบุได้ว่าคำแนะนำในการประกอบใดที่ตอบสนองต่อรหัสบรรทัดใดเป็นต้น


1
"ด้วยเหตุนี้โค้ดบางบรรทัดของคุณอาจถูกทิ้งไว้โดยไม่มีคำแนะนำใด ๆ เลยหรือบางบรรทัดอาจปนกันไปหมด" YUP ล้มเหลวในการใช้ Stack frames เพื่อรับชื่อของวิธีการ / คุณสมบัติปัจจุบัน - และคุณสมบัติจำนวนมากได้รับการอิน
ไลน์

4
"สิ่งที่สำคัญที่สุดคือในโหมดดีบักไม่มีการเพิ่มประสิทธิภาพ" ซึ่งเป็นที่ถกเถียงกันอยู่ สิ่งที่สำคัญที่สุดคือมีข้อมูลการดีบักซึ่งช่วยให้คุณแก้ไขข้อบกพร่องได้ แม้ว่าจะสามารถมีอยู่ในรุ่นได้เช่นกัน
shoosh

ฉันไม่รู้ว่าโหมดใดเป็นโหมดเริ่มต้น (Debug / Release) โดยทั่วไปจากประสบการณ์ของฉันโครงการทั้งหมดอยู่ในโหมดดีบักและทีมติดตั้งจะดูแลรุ่นนี้เพื่อหลีกเลี่ยงไฟล์ pdb และเพื่อแนะนำการเพิ่มประสิทธิภาพ แต่วันนี้ฉันเจอสถานการณ์ที่เปลี่ยนโหมดเป็นปล่อยและฉันไม่สามารถทำลายรหัสโดยใช้จุดพักได้ ฉันลองใช้เวลานาน 1 ชั่วโมงในการทำสิ่งต่างๆมากมายและในที่สุดฉันก็สังเกตเห็นว่ามันเกิดจากปัญหาในโหมดการคอมไพล์ปัจจุบัน @ Vlix- ขอบคุณสำหรับคำตอบ
kbvishnu

1
สิ่งนี้ช่วยฉันในการแก้ปัญหา "ชื่อ 'ตัวแปร' ไม่มีอยู่ในบริบทปัจจุบัน" ที่ฉันพบขณะพยายามวิเคราะห์สัญลักษณ์ภายในหน้าต่างทันทีในขณะที่แก้ไขข้อบกพร่องของแอปพลิเคชันที่สอดคล้องกับการกำหนดค่ารุ่นเริ่มต้น ขอบคุณมาก!
M463

1)ปัญหาต่อไปนี้มีอะไรบ้าง? มี 3 คอนฟิกในโปรเจ็กต์ ASP.NET MVC: base (web), debug (web.debug), release (web.release) สมมติว่าเราตั้งค่าการดีบักและปล่อยสตริงการเชื่อมต่อโดยการแปลงเป็น config ที่สอดคล้องกัน (debug and release) เมื่อเผยแพร่เราสามารถเผยแพร่ตามที่เราเลือกในกล่องโต้ตอบเผยแพร่ แต่เมื่อเรียกใช้แอปพลิเคชันแม้ว่าฉันจะเลือก Debug แต่ก็ใช้การกำหนดค่ารีลีส (เนื่องจากฉันตั้งค่าการดีบัก config ในฐานและการกำหนดค่าการดีบัก) เป็นเรื่องปกติหรือไม่
Jason

52

จริงๆแล้ว "Debug" และ "Release" เป็นเพียงป้ายกำกับสองป้ายสำหรับการตั้งค่าทั้งหมดที่อาจส่งผลต่อบิลด์และการดีบักของคุณ

ในโหมด "แก้ไขข้อบกพร่อง" คุณมักจะมีสิ่งต่อไปนี้:

  • ไฟล์ฐานข้อมูลโปรแกรมดีบักซึ่งช่วยให้คุณสามารถติดตามการทำงานของโปรแกรมได้อย่างใกล้ชิดในซอร์สในระหว่างรันไทม์
  • การเพิ่มประสิทธิภาพทั้งหมดปิดอยู่ซึ่งช่วยให้คุณตรวจสอบค่าของตัวแปรและติดตามไปยังฟังก์ชันที่อาจได้รับการปรับให้เหมาะสมหรืออยู่ในแถว
  • คำจำกัดความของตัวประมวลผลล่วงหน้า _DEBUG ที่ช่วยให้คุณสามารถเขียนโค้ดที่ทำหน้าที่แตกต่างกันในโหมดดีบักเมื่อเทียบกับรีลีสตัวอย่างเช่นเครื่องมือ ASSERT ที่ควรใช้ในขณะที่ดีบักเท่านั้น
  • การเชื่อมโยงไปยังไลบรารีที่ได้รับการคอมไพล์ด้วยตัวเลือกการดีบักซึ่งโดยปกติจะไม่ถูกปรับใช้กับลูกค้าจริง (ด้วยเหตุผลด้านขนาดและความปลอดภัย)

ในการเพิ่มประสิทธิภาพโหมด "Release" จะเปิดอยู่ (แม้ว่าจะมีหลายตัวเลือกให้ใช้งาน) และไม่ได้กำหนดนิยามของตัวประมวลผลล่วงหน้า _DEBUG โดยปกติคุณจะยังคงต้องการสร้างไฟล์ PDB เนื่องจากมีประโยชน์อย่างมากที่จะสามารถ "ดีบัก" ในโหมดรีลีสเมื่อสิ่งต่างๆทำงานได้เร็วขึ้น


5
"เพียงสองป้ายกำกับ" - อันที่จริง Visual Studio ช่วยให้คุณสามารถสร้างเพิ่มเติมได้! สิ่งนี้จะมีประโยชน์อย่างยิ่งในขณะทดสอบโปรแกรม ตัวอย่างเช่นฉันเพิ่งเขียนโปรแกรมสำหรับงานของฉันซึ่งยอมรับชื่อไฟล์จากบรรทัดคำสั่ง ฉันทดสอบการแยกวิเคราะห์บรรทัดคำสั่ง แต่เมื่อเสร็จแล้วฉันไม่ต้องการยุ่งกับ CMD และรายการชื่อไฟล์ทุกวัน ฉันสร้างการกำหนดค่าที่ฉันสามารถใช้การคอมไพล์แบบมีเงื่อนไขเพื่อจัดหาค่าบรรทัดคำสั่งจำลองและทดสอบตรรกะทางธุรกิจของโปรแกรมซึ่งทำให้ฉันมีวงจรการทำซ้ำเร็วขึ้นมากในการพัฒนาโปรแกรม
Brian S

9

โดยส่วนใหญ่การดีบักจะมีข้อมูลพิเศษมากมายที่เป็นประโยชน์เมื่อทำการดีบัก ในโหมดรีลีสทั้งหมดนี้ถูกตัดและแลกเปลี่ยนเพื่อประสิทธิภาพ


1)ปัญหาต่อไปนี้มีอะไรบ้าง? มี 3 คอนฟิกในโปรเจ็กต์ ASP.NET MVC: base (web), debug (web.debug), release (web.release) สมมติว่าเราตั้งค่าการดีบักและปล่อยสตริงการเชื่อมต่อโดยการแปลงเป็น config ที่สอดคล้องกัน (debug and release) เมื่อเผยแพร่เราสามารถเผยแพร่ตามที่เราเลือกในกล่องโต้ตอบเผยแพร่ แต่เมื่อเรียกใช้แอปพลิเคชันแม้ว่าฉันจะเลือก Debug แต่ก็ใช้การกำหนดค่ารีลีส (เนื่องจากฉันตั้งค่าการดีบัก config ในฐานและการกำหนดค่าการดีบัก) เป็นเรื่องปกติหรือไม่
Jason

2)เมื่อรันแอปพลิเคชันในโหมดดีบักหรือรีลีส VS ใช้การกำหนดค่าเว็บพื้นฐานหรือการกำหนดค่าเว็บที่เกี่ยวข้อง (web.debug.confg หรือ web.release.config) หรือไม่
Jason

7

หากคุณใช้ตัวเลือกการคอมไพล์โครงการและเปรียบเทียบคุณจะเห็นว่าอะไรคือความแตกต่าง

สมมติว่าคำถามเกี่ยวกับรหัสดั้งเดิม / C ++ (ยังไม่ชัดเจนจากการใช้วลี):

โดยทั่วไปใน Debug การเพิ่มประสิทธิภาพการสร้างโค้ดทั้งหมดจะปิดอยู่ ไลบรารีบางตัว (เช่นSTL ) เริ่มต้นในการตรวจสอบข้อผิดพลาดที่เข้มงวดขึ้น (เช่นตัวทำซ้ำดีบัก) มีการสร้างข้อมูลการแก้ไขจุดบกพร่องเพิ่มเติม (เช่นสำหรับ "แก้ไขและดำเนินการต่อ") มีการสร้างสิ่งต่างๆมากขึ้นในโค้ดเพื่อตรวจจับข้อผิดพลาด (ค่าตัวแปรโลคัลถูกตั้งค่าเป็นรูปแบบที่ไม่ได้กำหนดค่าเริ่มต้นและใช้ฮีปดีบัก)


2
@Vilx: ตอนที่ฉันตอบยังไม่มีแท็ก. net มี แต่ visualstudio ดังนั้นฉันจึงสันนิษฐานว่าเป็น C ++
NeARAZ

6

นอกจากนี้เห็นได้ชัดว่าโหมดดีบักจะสร้างเธรดพิเศษจำนวนมากเพื่อช่วยในการดีบัก สิ่งเหล่านี้ยังคงใช้งานได้ตลอดอายุของกระบวนการไม่ว่าคุณจะแนบดีบักเกอร์หรือไม่ก็ตาม ดูคำถามที่เกี่ยวข้องของฉันที่นี่


แต่สำหรับ. NET (ไม่ใช่ C ++) เท่านั้น?
Peter Mortensen

6

อาจเป็นเรื่องที่ควรค่าแก่การกล่าวถึงสิ่งที่ชัดเจนมากว่าการสร้างแฟล็กอนุญาตให้ใช้ตรรกะที่แตกต่างกันซึ่งควรใช้เพื่อเปลี่ยนการบันทึกและการส่งข้อความ "คอนโซล" แต่สามารถใช้ในทางที่ผิดและเปลี่ยนแปลงได้อย่างมากไม่เพียง แต่ในระดับต่ำเท่านั้น แต่ยังรวมถึงตรรกะทางธุรกิจที่แท้จริงด้วย


"... เปลี่ยนไปอย่างมาก ... ตรรกะทางธุรกิจที่แท้จริง" - ดูเหมือนจะเป็นข้อบกพร่องสำหรับฉัน! เรามีโค้ดเงื่อนไขจำนวนมากและทำให้เข้าใจยากมาก นอกจากนี้การรวมกันของแฟล็กรหัสเงื่อนไขแต่ละชุดเป็นเวอร์ชันที่แตกต่างกันของซอฟต์แวร์ของคุณซึ่งควรได้รับการทดสอบเพื่อให้แน่ใจว่ามีความถูกต้องและสมบูรณ์พื้นฐาน ตาม "Code Complete" คัมภีร์ไบเบิลของการสร้างซอฟต์แวร์ "Prime Directive" ของเราคือการจัดการความซับซ้อน (เป็นปัญหาอันดับ 1 ของเราที่ต้องแก้) คิดให้นานและหนักก่อนที่จะเพิ่มแฟล็กแบบมีเงื่อนไขเพิ่มเติม!
MicroservicesOnDDD

ความคิดเห็นข้างต้นของฉันไม่ได้มุ่งเป้าไปที่คำตอบนี้โดยเฉพาะตราบเท่าที่ประโยคสุดท้ายกล่าว ... นั่นเป็นเพียงสิ่งเพิ่มเติมที่ฉันคิดว่าผู้อ่านที่มาที่นี่ควรอ่าน
MicroservicesOnDDD

6

โปรดทราบว่าเมื่อใช้MFCตัวอย่างเช่นโครงการดีบักจะเชื่อมโยงกับเวอร์ชัน DLL ที่ไม่สามารถแจกจ่ายต่อได้เช่นMFC90D.DLLในขณะที่รุ่นสร้างลิงก์กับเวอร์ชันที่แจกจ่ายต่อได้เช่นMFC90.DLL. ซึ่งอาจคล้ายกับกรอบอื่น ๆ

ดังนั้นคุณอาจไม่สามารถเรียกใช้แอปพลิเคชันการดีบักบนเครื่องที่ไม่ได้พัฒนา


จริงแท้แน่นอน. วิ่งหนีสิ่งนี้ครั้งหนึ่งในขณะที่ลูกค้า ทำงานบนเครื่องของฉัน (TM)
Matt Jacobsen

คุณสามารถแจกจ่ายได้ .. (ไม่ทราบว่าคุณได้รับอนุญาต). พวกเขาต้องอยู่ในโฟลเดอร์ย่อยของแอปพลิเคชันของคุณ
Andreas Reiff

@Andreas เกี่ยวกับตัวอย่างของฉัน "ไม่สามารถแจกจ่ายต่อได้" หมายความว่า Microsoft ไม่อนุญาตให้แจกจ่ายสิ่งเหล่านี้
foraidt

4

ฉันก็อยากรู้คำถามนี้เช่นกันเมื่อฉันได้พัฒนาแอปพลิเคชันที่คัดลอกมาจากการกำหนดค่าการสร้างรุ่นที่มีอยู่

ฉันมีนักพัฒนาที่น่าสนใจในการใช้แอปพลิเคชันนั้นในโหมดดีบักดังนั้นฉันจึงสงสัยว่าจะต้องใช้อะไรบ้างในการสร้างการกำหนดค่าการสร้างนี้ที่มีอยู่ในชื่อของ ReleaseMyBuild ที่คัดลอกมาจากการกำหนดค่ารุ่น (ดังนั้นจึงควรมีการตั้งค่าทั้งหมดเพื่อเผยแพร่การเพิ่มประสิทธิภาพ ) เพื่อเปลี่ยนทีมอย่างกะทันหันและกลายเป็นบิวด์ดีบักแม้จะมีชื่อคอนฟิกูเรชันบิลด์ที่สับสน

ฉันคิดว่าการกำหนดค่าโครงการเป็นเพียงชื่อและวิธีที่สะดวกในการเลือก "การตั้งค่าทั้งหมด" ที่ Joris Timmermans กล่าวถึง ฉันอยากจะรู้ว่าสารัตถะเพียงการตั้งค่าสิ่งเหล่านั้นอาจเป็นไปได้ว่าจะทำให้การกำหนดค่าการสร้างชื่อ "ฟู" ฟังก์ชั่นเป็นที่ดีที่สุดการเปิดตัวสร้าง

นี่เป็นแวบเดียว ฉันสร้าง VCXPROJ ใหม่จากเทมเพลตโปรเจ็กต์ว่างจาก Visual Studio 2010 จากนั้นฉันก็คัดลอกและแก้ไขทั้งสองอย่างแรกเพื่อเก็บเนื้อหาการดีบักและเนื้อหาที่สองของรีลีส นี่คือความแตกต่างที่เน้นความแตกต่างที่เกี่ยวข้อง ...

VCXPROJs ที่ว่างเปล่า Debug vs Release diff

ปล่อย

<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ตั้งค่าเป็นจริง


3

ความแตกต่างที่เห็นได้ชัดคือขนาดของไบนารี รุ่น Debug สร้างไบนารีที่ใหญ่กว่ารุ่น Release

เมื่อคอมไพล์ใน Debug ตารางสัญลักษณ์จะถูกเพิ่มลงในอ็อบเจ็กต์ที่คอมไพล์แล้วของไฟล์โค้ดซึ่งช่วยให้โปรแกรมดีบั๊กแตะลงในไบนารีเหล่านี้และเข้าถึงค่าของอ็อบเจ็กต์และตัวแปร

ความแตกต่างที่สังเกตได้อีกประการหนึ่งคือในโหมดรีลีสไบนารีจะขัดข้องกับข้อผิดพลาดร้ายแรงขณะอยู่ในโหมดดีบักหากคุณเริ่มการดีบักแอปพลิเคชันใน Visual Studio คุณสามารถตรวจสอบกลุ่มการโทรซึ่งจะบอกตำแหน่งที่แน่นอนของคำสั่งที่ผิดพลาด .


-15

ฉันไม่รู้ว่าความแตกต่างที่แน่นอนคืออะไรเพราะจริงๆแล้วไม่มีข้อมูลเกี่ยวกับเรื่องนี้

แต่ความแตกต่างที่สังเกตได้หลัก ๆ ก็คือบางครั้งเวอร์ชันที่วางจำหน่ายจะทำให้ไฟล์ DLL เสียหายและทำให้แอปพลิเคชันของคุณใช้งานไม่ได้

น่าเศร้าที่คุณต้องใส่ debug build ในการผลิต และใช่ในการเผยแพร่คุณต้องใช้ FTP เก่าที่ดี


7
สิ่งนี้ตอบคำถามได้อย่างไร? และโปรดใส่ใจเมื่อคุณพิมพ์
mmking

ฉันมีปัญหาที่คล้ายกันรหัสทำงานในโหมดดีบัก แต่มีปัญหาในโหมดเผยแพร่ ปรากฎว่าปัญหาอยู่ในรหัสของฉัน มีบทความดีๆเกี่ยวกับปัญหาทั่วไปในเวอร์ชันรีลีสหวังว่านี่จะช่วยผู้อื่นได้เช่นกัน
Weihui Guo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.