Visual Studio ดีบักหนึ่งในหลายเธรด


127

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


คุณใช้ Visual Studio เวอร์ชันใด ด่วนโปรสุดยอด .. ?
ทำเครื่องหมาย

จากนั้นลิงก์ของ jeffamaphone จะช่วยได้และอาจเป็นข้อมูลเพิ่มเติมเพื่อเปลี่ยนไปใช้เธรดอื่นในขณะที่ดีบักmsdn.microsoft.com/en-us/library/bb157786.aspx
ทำเครื่องหมาย

ดูการอภิปรายที่เกี่ยวข้อง: visualstudio.uservoice.com/forums/121579-visual-studio/…
user626528

คำตอบ:


108

ใช่.

ในหน้าต่างเธรด (Debug -> Windows -> เธรด) คลิกขวาที่เธรดที่คุณต้องการแล้วเลือก "เปลี่ยนเป็นเธรด"

คุณยังสามารถเลือก "หยุด" บนเธรดที่คุณไม่ต้องการดีบักเพื่อป้องกันไม่ให้เธรดทำงานได้ อย่างไรก็ตามอย่าลืม "ละลาย" หากคุณคาดหวังว่าจะได้ผล

อ่านเพิ่มเติมอ่านเพิ่มเติม


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

รายได้สมบูรณ์: | คุณต้องคลิกที่สวิตช์ทุกครั้งที่มีอะไรเกิดขึ้น
deadManN

16

การก้าวผ่านเธรดเดียวดูเหมือนจะได้รับการแก้ไขเป็นส่วนใหญ่ใน VS 2012 (มีข้อแม้บางประการที่คุณสามารถดูได้ในลิงค์ด้านล่าง) จุดพักเป็นความเจ็บปวด

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

เวิร์กโฟลว์ที่มีประโยชน์อีกประการหนึ่งคือการใช้ตัวกรองเธรดกับเบรกพอยต์ของคุณซึ่งระบุไว้ในคำตอบบางส่วน:

สร้างเบรกพอยต์คลิกขวาที่เบรกพอยต์คลิกตัวกรองและป้อน ThreadId = 7740 (รหัสเธรดของคุณจากหน้าต่างเธรด)

สิ่งนี้อาจเป็นเรื่องที่น่าเบื่อมาก

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

โหวตข้อเสนอแนะหากคุณเห็นด้วยสิ่งนี้จะเป็นประโยชน์หรือเพิ่มข้อเสนอแนะของคุณเอง:

https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst


1
"การก้าวข้ามเธรดเดียวดูเหมือนจะได้รับการแก้ไขเป็นส่วนใหญ่ใน VS 2012" - ไม่จริงหรอกมันยังพังใน VS2017
user626528

10

นอกจากนี้คุณยังสามารถใส่เบรกพอยต์ตามเงื่อนไขในรหัสของคุณและใส่thread.Id == [someValue] หรือThread.Name == "[Somename]"ในสภาพเบรกพอยต์ ...


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

3

มีวิธีแก้ปัญหาที่เร็วกว่ามากสำหรับกรณีง่ายๆ - ดูความคิดเห็นในลิงก์ของสตีฟ

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

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

สิ่งนี้จะกลายเป็นปัญหาอย่างเห็นได้ชัดหากคุณมีเบรกพอยต์หลายจุดที่คุณต้องการเก็บไว้เป็นต้น - แต่สำหรับกรณีธรรมดาจะทำได้ง่ายกว่ามาก


2

สิ่งนี้คล้ายกับปัญหาที่คล้ายกันมากใน Visual Studio 2008 SP1 ได้รับการแก้ไขด้วยโปรแกรมแก้ไขด่วนหลัง SP แต่มีหลักฐานอื่น ๆ ที่แสดงว่าโปรแกรมแก้ไขด่วนไม่ได้รวมอยู่ในฐานรหัสรายการคำติชมนี้นี้ก็เป็นปัญหาเช่นกัน ไม่ใช่เรื่องผิดปกติที่โปรแกรมแก้ไขด่วนจะไม่รวมกลับมา

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

มีวิธีแก้ปัญหาเฉพาะสำหรับปัญหาของคุณคุณสามารถไปที่ Debug + Windows + Threads คลิกขวาที่เธรดที่คุณไม่ต้องการดีบักแล้วเลือก Freeze อย่าลืมละลายในภายหลัง

จุดบกพร่องเหล่านี้ได้รับการแก้ไขอีกครั้งใน Visual Studio 2010 Service Pack 1


1

ฉันใช้ Visual Studio Professional 2017 และฉันใช้หน้าต่างเธรดเพื่อเลือกตรึงและละลายเธรด โดยปกติฉันมีหลายเธรดที่มีรหัสเดียวกันและฉันต้องการเพียงแค่ตรึงไว้เท่านั้นไม่ใช่อย่างอื่น ฉันชอบหน้าต่าง MS Threads จริงๆเพราะฉันสามารถเลือกชุดย่อยของเธรดที่จะหยุดได้ ฉันจัดกลุ่มเธรดตามชื่อจากนั้นสามารถตรึงทุกเธรดที่ใช้รหัสเดียวกันกับที่ฉันกำลังดีบักในขณะที่ปล่อยให้เธรดที่เหลือทำงาน ฉันลองใช้ส่วนขยายเออร์วินเมเยอร์และทำงานได้ดีมาก แต่มันค้างเธรดทั้งหมดยกเว้นเธรดที่ฉันใช้งานอยู่และบางครั้งฉันก็ตกอยู่ในสถานการณ์เมื่อการดีบั๊กไม่ถึงจุดพักฉันคิดว่ามันควรจะเป็นเพราะทั้งหมด เธรดอื่น ๆ หยุดทำงานและดูเหมือนว่าแอปพลิเคชันจะหยุดทำงาน การกดปุ่มหยุดชั่วคราวและการยกเลิกการคลายเธรดในหน้าต่างเธรดจะช่วยแก้ปัญหานั้นได้


0

5. ก้าวผ่านด้ายเส้นเดียวโดยไม่ต้องกระโดดไปมา

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

  1. ปิดใช้งานหรือลบเบรกพอยต์ที่โดนเธรดใหม่ที่ดีบักเกอร์เปลี่ยนไปใช้
  2. กดดำเนินการต่อ (F5)
  3. สังเกตว่าขั้นตอนเริ่มต้นแรกของคุณในเธรดแรกนั้นเสร็จสิ้นอย่างไรและตอนนี้เป็นบริบทการดีบักที่ใช้งานอยู่
  4. เนื่องจากเบรกพอยต์ของคุณถูกลบหรือปิดใช้งานคุณสามารถดำเนินการต่อในเธรดเดี่ยวนั้นได้โดยไม่หยุดชะงัก

7 แฮ็กที่รู้จักกันน้อยกว่าสำหรับการดีบักใน Visual Studio

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