Saya punya solusi dengan beberapa proyek. Ada beberapa break-point di berbagai proyek. Saya ingin melacak utas pertama mengenai salah satu break-point ini dan terus menelusuri utas tunggal tersebut meskipun ada utas lain yang memasuki blok kode yang sama.
Saya tahu ini dimungkinkan melalui mendefinisikan suatu kondisi pada break-point, yaitu, nama thread = ... atau utas = = tapi kasus saya adalah aplikasi ASP.NET yang sarat dengan muatan dan segera setelah saya lampirkan ke w3wp.exe
banyak utas akan mencapai titik break. Saya butuh sesuatu seperti ThreadLocal<break-point>
.
Apa itu mungkin? Jika ya, bagaimana caranya?
Jawaban:
Membekukan / Mencairkan utas adalah cara yang salah karena utas lain tidak menjalankan kode apa pun.
Cara yang paling benar dan bermanfaat adalah:
Dalam Visual Studio 2015 dan yang lebih baru, prosesnya serupa:
Jadi semua utas dieksekusi, tetapi debugger hanya mengenai utas saat ini.
sumber
System.Threading.Thread.CurrentThread.ManagedThreadId
atau sesuatu?Inilah yang saya lakukan:
Tetapkan titik istirahat bersyarat yang saya tahu hanya akan mengenai utas yang saya cari.
Setelah breakpoint hits dan Anda berada di utas yang Anda inginkan, di jendela Visual Studio Threads (saat debugging, Debug -> Windows -> Threads), Ctrl+ A(untuk memilih semua utas), dan kemudian Ctrl+ klik utas yang saat ini Anda aktifkan . Anda harus memiliki semua utas kecuali yang ingin Anda debug dipilih.
Sekarang, Visual Studio hanya akan melangkah melalui utas yang dicairkan. Tampaknya jauh lebih lambat ketika melakukan ini, mungkin karena ia harus melewati semua utas yang dibekukan, tetapi hal ini membawa kewarasan pada debugging multi-utas saya.
sumber
Saya baru saja merilis ekstensi Visual Studio 2010+ yang melakukan persis apa yang Anda cari. Dan gratis :).
Lihat di sini di Galeri , di halaman resmi atau repositori Github .
sumber
Jika beberapa utas sedang muncul untuk aplikasi web, jawaban @MattFaus tidak akan berfungsi. apa yang saya lakukan adalah sebagai berikut
sumber
Pendekatan yang sedikit berbeda yang saya gunakan:
Ini mengasumsikan Anda punya waktu untuk melakukan hal di atas sebelum utas kedua mengenai breakpoint Anda. Jika tidak dan utas lainnya mengenai breakpoint Anda sebelum Anda melakukan hal di atas, Anda dapat mengeklik kanannya di jendela utas dan memilih membeku.
sumber
lock(m_someObject) { ; }
Dalam VS 2019:
sumber
Saya akan menyarankan untuk menambahkan instance aplikasi lain pada server langsung, baik pada perangkat keras yang sama atau mesin baru (klaster itu) dan kemudian debug hanya contoh itu. Saya tidak akan menambahkan breakpoint dalam kode yang dipicu pengguna. Jika itu bukan opsi, saya akan menambahkan lebih banyak penelusuran.
Namun, jika ini benar-benar diperlukan dan Anda memerlukan stat solusi, saya yakin Anda dapat menambahkan breakpoint yang hanya akan rusak jika permintaan berasal dari alamat IP Anda. Anda akan melakukan ini dengan menambahkan breakpoint bersyarat yang memeriksa
HttpContext.Request.UserHostAddress
. Namun perlu dicatat bahwa ini sangat memperlambat aplikasi Anda.sumber
Jika Anda tidak ingin menghentikan semua utas lainnya (mungkin Anda melampirkan Visual Studio debugger ke aplikasi yang sedang berjalan yang perlu menjawab permintaan), Anda bisa menggunakan makro yang membuat dan menghapus breakpoint secara otomatis.
Ini disarankan dalam jawaban untuk pertanyaan Stack Overflow "Step over" ketika men- debug program multithreaded di Visual Studio .
Namun, tautan hanya menjelaskan cara men-debug baris demi baris. Saya sarankan Anda memodifikasi makro (jika Anda nyaman dengan itu) untuk membuatnya memodifikasi semua breakpoints (dalam rentang garis tertentu misalnya) untuk berhenti hanya pada utas saat ini.
sumber
Saya pikir ini sedikit berbeda di Visual Studio 2015. Mereka telah mengubah beberapa hal di breakpoints, tapi inilah cara menerapkan jawaban yang diterima dari hzdbyte (di atas):
Pada breakpoint di margin coding, Klik kanan> Ketentuan> Ubah dari 'Ekspresi Bersyarat' menjadi 'Filter'. Ini kemudian memungkinkan Anda untuk memfilter berdasarkan ThreadId.
Atau di breakpoint di jendela Breakpoints, Klik kanan> Pengaturan> centang kotak Ketentuan dan lakukan di atas.
sumber
Tetapkan Kondisi Breakpoint dengan mengklik kanan bilah samping garis. Pilih "Kondisi" dan masukkan yang berikut ini dengan nama utas Anda dalam tanda kutip:
System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"
Atau Anda dapat melakukan hal yang sama dengan mendapatkan "Managed ID" utas dari Jendela "Utas" dan menggunakan:
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
sumber