Visual Studio, debug salah satu dari banyak utas

127

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?

Oskar Kjellin
sumber
versi Visual Studio yang Anda gunakan? Express, Pro, Ultimate ..?
Tandai
lalu tautan jeffamaphone akan membantu dan mungkin ini juga untuk informasi lebih lanjut untuk beralih ke utas lain saat men-
Tandai

Jawaban:

107

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 .

i_am_jorf
sumber
24
Saya bingung. Apakah jawabannya "Itu tidak bisa dilakukan?" Pertanyaannya adalah bagaimana cara tetap terkunci pada utas tertentu sehingga debugger tidak akan melompat-lompat di antara mereka. Beralih ke utas baik-baik saja, tetapi segera setelah utas lainnya melakukan sesuatu, kemudian debugger melompat ke sana. Jika saya tidak dapat membekukan utas lainnya karena perlu melakukan hal-hal, lalu bagaimana saya tetap terkunci pada utas yang saya khawatirkan?
bubbleking
Tidak lengkap: | Anda harus selalu mengeklik sakelar ke, setiap kali sesuatu terjadi
deadManN
16

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

Steve
sumber
1
"Single melangkah melalui satu utas tampaknya sebagian besar diperbaiki di VS 2012" - tidak juga, itu masih rusak di VS2017.
user626528
10

Anda juga bisa meletakkan breakpoint bersyarat di kode Anda dan meletakkan thread.Id == [someValue] atau Thread.Name == "[Somename]"dalam kondisi breakpoint ...

Charles Bretana
sumber
Terima kasih Charles, itu sangat membantu (tidak tahu Anda bisa melakukan itu). Namun, cara paling efisien bagi saya untuk melakukan debug adalah yang ditulis jeffamaphone karena saya tidak tahu nama sebelum menyentuh breakpoint dan melihat beberapa nilai
Oskar Kjellin
3

Ada solusi yang jauh lebih cepat untuk kasus-kasus sederhana - lihat komentar di tautan Steve.

debugger hanya akan pernah menyelesaikan langkah di utas dari mana langkah itu berasal. Jadi, jika Anda mencapai breakpoint, nonaktifkan, dan kemudian mulai melangkah Anda tidak harus berhenti di utas lainnya. Jika Anda memiliki breakpoint lain dalam aplikasi Anda dan utas lainnya mengenai salah satunya, maka Anda akan debugging dalam status utas campuran seperti dijelaskan

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.

Boris
sumber
2

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.

Hans Passant
sumber
1

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.

BlueMax
sumber
0

5. Langkah melalui satu utas tanpa melompat-lompat

Seberapa sering Anda men-debug kode multithreaded, ketika Anda mencapai breakpoint pertama Anda, mengambil langkah, dan kemudian tiba-tiba Anda dihentikan dengan panah kuning di utas lainnya? Perilaku tak terduga datang dari breakpoint yang masih ditetapkan dan akibatnya dipukul. Secara default, debugger akan berhenti pada breakpoint setiap kali dipukul. Ini berarti bahwa ketika Anda mengambil langkah, semua utas diizinkan untuk berjalan, dan salah satu utas yang sedang berjalan mencapai breakpoint ini sebelum langkah selesai pada utas Anda saat ini. Lain kali Anda berada dalam situasi ini coba ini:

  1. Nonaktifkan atau hapus breakpoint yang telah dihantam oleh utas baru yang dialihkan oleh debugger.
  2. tekan Lanjutkan (F5)
  3. Amati bagaimana langkah awal pertama Anda pada utas pertama selesai dan sekarang adalah konteks debugging aktif.
  4. Karena breakpoints Anda dihapus atau dinonaktifkan, Anda dapat terus menginjak utas tunggal tanpa gangguan.

7 peretasan yang kurang dikenal untuk debugging di Visual Studio

rebornx
sumber