ฉันมีแอปพลิเคชันที่มี 4 เธรดที่ใช้รหัสเดียวกัน อย่างไรก็ตามเมื่อฉันก้าวมันกระโดดไปมาระหว่างเธรดต่างๆ ฉันจะล็อคเข้ากับเธรดเดียวเพื่อให้เธรดอื่นถูกละเว้นสำหรับการดีบักได้อย่างไร
ฉันมีแอปพลิเคชันที่มี 4 เธรดที่ใช้รหัสเดียวกัน อย่างไรก็ตามเมื่อฉันก้าวมันกระโดดไปมาระหว่างเธรดต่างๆ ฉันจะล็อคเข้ากับเธรดเดียวเพื่อให้เธรดอื่นถูกละเว้นสำหรับการดีบักได้อย่างไร
คำตอบ:
ใช่.
ในหน้าต่างเธรด (Debug -> Windows -> เธรด) คลิกขวาที่เธรดที่คุณต้องการแล้วเลือก "เปลี่ยนเป็นเธรด"
คุณยังสามารถเลือก "หยุด" บนเธรดที่คุณไม่ต้องการดีบักเพื่อป้องกันไม่ให้เธรดทำงานได้ อย่างไรก็ตามอย่าลืม "ละลาย" หากคุณคาดหวังว่าจะได้ผล
อ่านเพิ่มเติมอ่านเพิ่มเติม
การก้าวผ่านเธรดเดียวดูเหมือนจะได้รับการแก้ไขเป็นส่วนใหญ่ใน VS 2012 (มีข้อแม้บางประการที่คุณสามารถดูได้ในลิงค์ด้านล่าง) จุดพักเป็นความเจ็บปวด
เธรดการแช่แข็งและการละลายเป็นวิธีแก้ปัญหาตามปกติดังที่คำตอบก่อนหน้านี้ระบุไว้ แต่มันน่าเบื่อและอาจทำให้แฮงค์ได้เมื่อเธรดของคุณรอเธรดอื่นที่ค้าง สิ่งเหล่านี้อาจเป็นเรื่องยากที่จะฟื้นตัวโดยไม่สูญเสียสถานที่ในหัวข้อที่คุณสนใจ
เวิร์กโฟลว์ที่มีประโยชน์อีกประการหนึ่งคือการใช้ตัวกรองเธรดกับเบรกพอยต์ของคุณซึ่งระบุไว้ในคำตอบบางส่วน:
สร้างเบรกพอยต์คลิกขวาที่เบรกพอยต์คลิกตัวกรองและป้อน ThreadId = 7740 (รหัสเธรดของคุณจากหน้าต่างเธรด)
สิ่งนี้อาจเป็นเรื่องที่น่าเบื่อมาก
ข้อเสนอแนะของฉันสำหรับ Microsoft คือแก้ไขการก้าวเดียว (และรูปแบบต่างๆ) เพื่อไม่ให้เปลี่ยนเธรดเว้นแต่จะมีการกดเบรกพอยต์อย่างชัดเจนในเธรดอื่น นอกจากนี้ยังควรเพิ่มทางลัด (อาจเป็น Ctrl-F9) เพื่อสร้างเบรกพอยต์โดยมีรหัสเธรดปัจจุบันเป็นตัวกรอง สิ่งนี้จะทำให้เวิร์กโฟลว์ที่สองสะดวกยิ่งขึ้น
โหวตข้อเสนอแนะหากคุณเห็นด้วยสิ่งนี้จะเป็นประโยชน์หรือเพิ่มข้อเสนอแนะของคุณเอง:
นอกจากนี้คุณยังสามารถใส่เบรกพอยต์ตามเงื่อนไขในรหัสของคุณและใส่thread.Id == [someValue]
หรือThread.Name == "[Somename]"
ในสภาพเบรกพอยต์ ...
มีวิธีแก้ปัญหาที่เร็วกว่ามากสำหรับกรณีง่ายๆ - ดูความคิดเห็นในลิงก์ของสตีฟ
ดีบักเกอร์จะทำตามขั้นตอนบนเธรดที่เป็นจุดเริ่มต้นของขั้นตอนเท่านั้น ดังนั้นหากคุณกดเบรกพอยต์ให้ปิดการใช้งานจากนั้นเริ่มก้าวคุณไม่ควรหยุดบนเธรดอื่น หากคุณมีเบรกพอยต์อื่นในแอปพลิเคชันของคุณและเธรดอื่นเข้าสู่จุดเดียวคุณจะทำการดีบักในสถานะเธรดผสมตามที่อธิบายไว้
ดังนั้นในกรณีของฉันเมื่อเธรดต่างๆเริ่มชนจุดพักฉันก็กด Continue สองสามครั้งจนกว่าฉันจะระบุการโทรที่ฉันกำลังมองหาจากนั้นลบเบรกพอยต์และก้าวผ่านส่วนที่เหลือของโค้ดในขณะที่ยังคงอยู่บนเธรดเดียวกันโดยไม่มีการรบกวนจาก ส่วนที่เหลือ
สิ่งนี้จะกลายเป็นปัญหาอย่างเห็นได้ชัดหากคุณมีเบรกพอยต์หลายจุดที่คุณต้องการเก็บไว้เป็นต้น - แต่สำหรับกรณีธรรมดาจะทำได้ง่ายกว่ามาก
สิ่งนี้คล้ายกับปัญหาที่คล้ายกันมากใน Visual Studio 2008 SP1 ได้รับการแก้ไขด้วยโปรแกรมแก้ไขด่วนหลัง SP แต่มีหลักฐานอื่น ๆ ที่แสดงว่าโปรแกรมแก้ไขด่วนไม่ได้รวมอยู่ในฐานรหัสรายการคำติชมนี้นี้ก็เป็นปัญหาเช่นกัน ไม่ใช่เรื่องผิดปกติที่โปรแกรมแก้ไขด่วนจะไม่รวมกลับมา
ไม่มีรายการคำติชมที่ตรงกับปัญหาของคุณอย่างน้อยก็หาได้ ฉันขอแนะนำให้คุณยื่นหนึ่งไฟล์ เนื่องจากปัญหาตามปกติในการทำให้เกิดข้อบกพร่องเช่นนี้เราขอแนะนำอย่างยิ่งให้คุณรวมโครงการการทำสำเนาที่แสดงปัญหานี้พร้อมคำแนะนำในการทำให้เกิดปัญหาอีกครั้ง
มีวิธีแก้ปัญหาเฉพาะสำหรับปัญหาของคุณคุณสามารถไปที่ Debug + Windows + Threads คลิกขวาที่เธรดที่คุณไม่ต้องการดีบักแล้วเลือก Freeze อย่าลืมละลายในภายหลัง
จุดบกพร่องเหล่านี้ได้รับการแก้ไขอีกครั้งใน Visual Studio 2010 Service Pack 1
ฉันใช้ Visual Studio Professional 2017 และฉันใช้หน้าต่างเธรดเพื่อเลือกตรึงและละลายเธรด โดยปกติฉันมีหลายเธรดที่มีรหัสเดียวกันและฉันต้องการเพียงแค่ตรึงไว้เท่านั้นไม่ใช่อย่างอื่น ฉันชอบหน้าต่าง MS Threads จริงๆเพราะฉันสามารถเลือกชุดย่อยของเธรดที่จะหยุดได้ ฉันจัดกลุ่มเธรดตามชื่อจากนั้นสามารถตรึงทุกเธรดที่ใช้รหัสเดียวกันกับที่ฉันกำลังดีบักในขณะที่ปล่อยให้เธรดที่เหลือทำงาน ฉันลองใช้ส่วนขยายเออร์วินเมเยอร์และทำงานได้ดีมาก แต่มันค้างเธรดทั้งหมดยกเว้นเธรดที่ฉันใช้งานอยู่และบางครั้งฉันก็ตกอยู่ในสถานการณ์เมื่อการดีบั๊กไม่ถึงจุดพักฉันคิดว่ามันควรจะเป็นเพราะทั้งหมด เธรดอื่น ๆ หยุดทำงานและดูเหมือนว่าแอปพลิเคชันจะหยุดทำงาน การกดปุ่มหยุดชั่วคราวและการยกเลิกการคลายเธรดในหน้าต่างเธรดจะช่วยแก้ปัญหานั้นได้
5. ก้าวผ่านด้ายเส้นเดียวโดยไม่ต้องกระโดดไปมา
คุณทำการดีบักโค้ดมัลติเธรดบ่อยเพียงใดเมื่อคุณไปถึงเบรกพอยต์แรกทำตามขั้นตอนแล้วจู่ๆคุณก็หยุดด้วยลูกศรสีเหลืองบนเธรดอื่น พฤติกรรมที่ไม่คาดคิดมาจากจุดพักที่ยังคงถูกตั้งค่าและส่งผลให้ถูกกระแทก โดยค่าเริ่มต้นดีบักเกอร์จะหยุดที่เบรกพอยต์ทุกครั้งที่ถูกโจมตี ซึ่งหมายความว่าเมื่อคุณทำตามขั้นตอนเธรดทั้งหมดจะได้รับอนุญาตให้ทำงานและหนึ่งในเธรดที่ทำงานอยู่ของคุณจะเข้าสู่เบรกพอยต์นี้ก่อนที่ขั้นตอนจะเสร็จสมบูรณ์ในเธรดปัจจุบันของคุณ ครั้งต่อไปที่คุณตกอยู่ในสถานการณ์นี้ให้ลองทำดังนี้:
- ปิดใช้งานหรือลบเบรกพอยต์ที่โดนเธรดใหม่ที่ดีบักเกอร์เปลี่ยนไปใช้
- กดดำเนินการต่อ (F5)
- สังเกตว่าขั้นตอนเริ่มต้นแรกของคุณในเธรดแรกนั้นเสร็จสิ้นอย่างไรและตอนนี้เป็นบริบทการดีบักที่ใช้งานอยู่
- เนื่องจากเบรกพอยต์ของคุณถูกลบหรือปิดใช้งานคุณสามารถดำเนินการต่อในเธรดเดี่ยวนั้นได้โดยไม่หยุดชะงัก