Saya memiliki aplikasi dengan 4 utas yang bekerja dengan kode yang sama. Namun, ketika saya melangkah, ia melompat di antara berbagai utas. Bagaimana saya bisa menguncinya ke satu utas sehingga utas lainnya diabaikan untuk debugging?
c#
multithreading
visual-studio-2010
Oskar Kjellin
sumber
sumber
Jawaban:
Iya.
Di jendela Utas (Debug -> Windows -> Utas) klik kanan utas yang Anda inginkan dan pilih "alihkan ke utas".
Anda juga dapat memilih "beku" pada utas yang tidak ingin Anda debug agar tidak berjalan. Namun, jangan lupa untuk "mencairkan" mereka jika Anda mengharapkan mereka melakukan pekerjaan.
Bacaan lebih lanjut .
sumber
Satu langkah melalui satu utas tampaknya sebagian besar diperbaiki di VS 2012 (dengan beberapa peringatan yang dapat Anda lihat di tautan saya di bawah). Breakpoint adalah rasa sakit.
Pembekuan dan pencairan benang adalah solusi yang biasa, seperti jawaban sebelumnya telah menyatakan, tetapi itu membosankan, dan dapat menyebabkan hang ketika utas Anda menunggu pada utas lain yang membeku. Ini bisa sulit untuk pulih dari tanpa kehilangan tempat Anda di minat Anda.
Alur kerja lain yang bermanfaat adalah menerapkan filter ulir pada breakpoints Anda, juga dinyatakan dalam beberapa jawaban:
Buat breakpoint, klik kanan pada breakpoint, klik Filter, dan masukkan ThreadId = 7740 (id utas Anda dari jendela utas).
Ini bisa sangat membosankan.
Saran saya kepada Microsoft adalah untuk memperbaiki loncatan tunggal (dan variasi darinya) untuk tidak pernah mengganti utas kecuali jika breakpoint eksplisit mengenai utas lainnya. Mereka juga harus menambahkan pintasan (mungkin Ctrl-F9) untuk membuat breakpoint dengan id utas saat ini sebagai filternya. Ini akan membuat alur kerja kedua jauh lebih nyaman.
Pilih saran jika Anda setuju ini akan berguna, atau tambahkan saran Anda sendiri:
https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst
sumber
Anda juga bisa meletakkan breakpoint bersyarat di kode Anda dan meletakkan
thread.Id == [someValue]
atauThread.Name == "[Somename]"
dalam kondisi breakpoint ...sumber
Ada solusi yang jauh lebih cepat untuk kasus-kasus sederhana - lihat komentar di tautan Steve.
Jadi dalam kasus saya setelah berbagai utas mulai mengenai breakpoint saya, saya hanya menekan Lanjutkan beberapa kali sampai saya mengidentifikasi panggilan yang saya cari - kemudian menghapus breakpoint dan melangkah melalui sisa kode sambil tetap pada utas yang sama tanpa gangguan dari sisanya.
Ini jelas menjadi masalah jika Anda memiliki banyak breakpoint yang ingin Anda pertahankan, dll. - tetapi sekali lagi untuk kasus sederhana ini jauh lebih mudah dilakukan.
sumber
Ini sangat menyerupai masalah yang sangat mirip dalam Visual Studio 2008 SP1. Itu diperbaiki dengan perbaikan terbaru pasca-SP. Tapi ada bukti lain bahwa perbaikan terbaru tidak dimasukkan ke dalam basis kode, item umpan balik ini juga masalah. Bukan tidak biasa untuk perbaikan terbaru untuk tidak terintegrasi kembali.
Tidak ada item umpan balik yang persis menggambarkan masalah Anda, setidaknya yang dapat saya temukan. Saya sarankan Anda mengajukan satu. Mengingat masalah yang biasa terjadi pada mereproduksi bug seperti ini, saya sangat menyarankan Anda menyertakan proyek reproduksi yang menunjukkan masalah ini dengan instruksi tentang cara mereproduksi masalah.
Ada beberapa solusi untuk masalah Anda, Anda bisa masuk ke Debug + Windows + Threads, klik kanan utas yang tidak ingin Anda debug dan pilih Freeze. Jangan lupa untuk mencairkannya nanti.
Bug ini diperbaiki lagi di Visual Studio 2010 Paket Layanan 1.
sumber
Saya Menggunakan Visual Studio Professional 2017, dan saya menggunakan jendela Threads untuk membekukan dan mencairkan thread secara selektif. Biasanya saya memiliki beberapa utas dari kode yang sama dan saya hanya ingin membekukannya, bukan yang lain. Saya sebenarnya menyukai jendela MS Threads karena saya dapat memilih subset dari thread yang akan dibekukan. Saya mengelompokkan utas berdasarkan nama dan kemudian dapat membekukan semua yang menjalankan kode yang sama seperti saya men-debug sambil membiarkan sisa utas berjalan. Saya mencoba menggunakan ekstensi Erwin Mayer, dan itu bekerja dengan sangat baik, tetapi itu membekukan semua utas kecuali yang saya jalankan, dan saya kadang-kadang masuk ke situasi ketika debugging tidak mencapai breakpoint yang saya pikir seharusnya, kemudian karena semua utas lainnya dihentikan dan aplikasi tampaknya terhenti. Menekan tombol pause, dan membuka thread pada jendela thread memperbaiki masalah itu.
sumber
7 peretasan yang kurang dikenal untuk debugging di Visual Studio
sumber