Visual Studio, gỡ lỗi một trong nhiều chủ đề


127

Tôi có một ứng dụng với 4 luồng làm việc cùng mã. Tuy nhiên, khi tôi bước nó nhảy giữa các luồng khác nhau. Làm thế nào tôi có thể khóa nó vào một luồng để các luồng khác bị bỏ qua để gỡ lỗi?


bạn đang sử dụng phiên bản nào của Visual Studio? Express, Pro, Ultimate ..?
Đánh dấu

sau đó liên kết của jeffamaphone sẽ giúp ích và có thể điều này cũng để biết thêm thông tin để chuyển sang một chủ đề khác trong khi gỡ lỗi msdn.microsoft.com/en-us/l
Đánh dấu

Xem các cuộc thảo luận liên quan: visualstudio.uservoice.com/forums/121579-visual-studio/...
user626528

Câu trả lời:


107

Đúng.

Trong cửa sổ Chủ đề (Gỡ lỗi -> Windows -> Chủ đề) nhấp chuột phải vào chuỗi bạn muốn và chọn "chuyển sang chuỗi".

Bạn cũng có thể chọn "đóng băng" trên các chủ đề mà bạn không muốn gỡ lỗi để giữ cho chúng không chạy. Tuy nhiên, đừng quên "làm tan băng" chúng nếu bạn muốn chúng làm việc.

Đọc thêm .


24
Tôi bối rối. Là câu trả lời "Nó không thể được thực hiện?" Câu hỏi hỏi làm thế nào để giữ khóa cho một chủ đề cụ thể để trình gỡ lỗi sẽ không nhảy xung quanh chúng. Chuyển sang một chủ đề là tốt, nhưng ngay sau khi một chủ đề khác làm một cái gì đó, sau đó trình gỡ lỗi nhảy đến nó. Nếu tôi không thể đóng băng các chủ đề khác bởi vì nó cần phải làm công cụ, vậy làm thế nào để tôi luôn bị khóa với chủ đề mà tôi quan tâm?
bong bóng

Chưa hoàn thành: | bạn phải luôn nhấp vào chuyển sang, mỗi khi có điều gì đó xảy ra
deadManN

16

Bước đơn qua một luồng dường như hầu hết được cố định trong VS 2012 (với một số cảnh báo bạn có thể thấy trong liên kết của tôi dưới đây). Điểm dừng là một nỗi đau.

Chủ đề đóng băng và tan băng là cách giải quyết thông thường, như các câu trả lời trước đây đã nêu, nhưng nó tẻ nhạt và nó có thể gây ra treo khi chủ đề của bạn chờ trên một chủ đề khác bị đóng băng. Đây có thể là khó khăn để phục hồi mà không mất vị trí của bạn trong chủ đề quan tâm của bạn.

Một quy trình công việc hữu ích khác là áp dụng bộ lọc luồng trên các điểm dừng của bạn, cũng được nêu trong một số câu trả lời:

Tạo một điểm dừng, nhấp chuột phải vào điểm dừng, nhấp vào Bộ lọc và nhập ThreadId = 7740 (id chủ đề của bạn từ cửa sổ chủ đề).

Điều này có thể rất tẻ nhạt.

Đề nghị của tôi với Microsoft là sửa lỗi bước đơn (và các biến thể của nó) để không bao giờ chuyển đổi chủ đề trừ khi điểm dừng rõ ràng bị đánh vào luồng khác. Họ cũng nên thêm một lối tắt (có thể là Ctrl-F9) để tạo điểm dừng với id luồng hiện tại làm bộ lọc. Điều này sẽ làm cho công việc thứ hai thuận tiện hơn nhiều.

Bỏ phiếu cho đề xuất nếu bạn đồng ý điều này sẽ hữu ích hoặc thêm đề xuất của riêng bạn:

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


1
"Bước đơn qua một luồng dường như hầu hết được cố định trong VS 2012" - không thực sự, nó vẫn bị hỏng trong VS2017.
dùng626528

10

Bạn cũng có thể đặt một điểm dừng có điều kiện trong mã của mình và đặt thread.Id == [someValue] hoặc Thread.Name == "[Somename]"trong điều kiện điểm dừng ...


Cảm ơn Charles, điều đó rất hữu ích (không biết bạn có thể làm điều đó). Tuy nhiên, cách hiệu quả nhất để tôi gỡ lỗi là cách mà jeffamaphone đã viết khi tôi không biết tên trước khi nó chạm đến điểm dừng và thấy một số giá trị
Oskar Kjellin

3

Một cách giải quyết nhanh hơn nhiều cho các trường hợp đơn giản - xem các bình luận trong liên kết của Steve.

trình gỡ lỗi sẽ chỉ hoàn thành một bước trên luồng mà từ đó bước được khởi tạo. Vì vậy, nếu bạn nhấn một điểm dừng, vô hiệu hóa nó, và sau đó bắt đầu bước bạn không nên dừng lại trên một chủ đề khác. Nếu bạn có các điểm dừng khác trong ứng dụng của mình và một luồng khác chạm vào một điểm, thì bạn sẽ gỡ lỗi trong trạng thái luồng hỗn hợp như được mô tả

Vì vậy, trong trường hợp của tôi, khi các luồng khác nhau bắt đầu chạm vào điểm dừng của tôi, tôi chỉ nhấn Tiếp tục một vài lần cho đến khi tôi xác định được cuộc gọi mà tôi đang tìm kiếm - sau đó xóa điểm dừng và bước qua phần còn lại của mã trong khi vẫn ở trên cùng một luồng mà không bị nhiễu phần còn lại của họ.

Điều này rõ ràng trở thành một vấn đề nếu bạn có nhiều điểm dừng mà bạn muốn giữ, v.v. - nhưng một lần nữa đối với các trường hợp đơn giản, điều này dễ thực hiện hơn nhiều.


2

Điều này rất giống với một vấn đề rất giống trong Visual Studio 2008 SP1. Nó đã được sửa với một hotfix post SP. Nhưng có bằng chứng khác cho thấy các hotfix không được tích hợp vào cơ sở mã, mục phản hồi này cũng là một vấn đề. Không có gì bất thường khi các hotfix không được tích hợp trở lại.

Không có mục phản hồi nào mô tả chính xác vấn đề của bạn, ít nhất là tôi có thể tìm thấy. Tôi khuyên bạn nên nộp một. Trước những rắc rối thông thường với việc tái tạo các lỗi như thế này, tôi thực sự khuyên bạn nên bao gồm một dự án tái tạo thể hiện vấn đề này với các hướng dẫn về cách tái tạo vấn đề.

Có một cách giải quyết khác nhau cho vấn đề của bạn, bạn có thể vào Debug + Windows + Chủ đề, nhấp chuột phải vào chủ đề bạn không muốn gỡ lỗi và chọn Đóng băng. Đừng quên làm tan chúng sau.

Các lỗi này đã được sửa một lần nữa trong Visual Studio 2010 Service Pack 1.


1

Tôi đang sử dụng Visual Studio Professional 2017 và tôi sử dụng cửa sổ Chủ đề để chọn lọc đóng băng và làm tan các chủ đề. Thông thường tôi có nhiều luồng của cùng một mã và tôi chỉ muốn đóng băng chúng, không phải các luồng khác. Tôi thực sự thích cửa sổ MS Themes vì ​​tôi có thể chọn một tập hợp con của các chủ đề để đóng băng. Tôi nhóm các luồng theo tên và sau đó có thể đóng băng tất cả các chuỗi chạy cùng mã khi tôi gỡ lỗi trong khi để các luồng còn lại chạy. Tôi đã thử sử dụng tiện ích mở rộng Erwin Mayer và nó hoạt động rất tốt, nhưng nó đóng băng tất cả các luồng ngoại trừ luồng tôi đang chạy và đôi khi tôi gặp phải tình huống khi gỡ lỗi không đạt đến điểm dừng tôi nghĩ, vì vậy tất cả các các chủ đề khác bị dừng lại và ứng dụng dường như bị dừng lại. Nhấn nút tạm dừng và giải phóng các luồng trong cửa sổ luồng sẽ khắc phục sự cố đó.


0

5. Bước qua một chủ đề duy nhất mà không phải nhảy xung quanh

Tần suất bạn gỡ lỗi mã đa luồng, khi bạn đạt điểm dừng đầu tiên, thực hiện một bước và sau đó đột nhiên bạn bị dừng với mũi tên màu vàng trên một luồng khác? Hành vi bất ngờ đến từ điểm dừng vẫn được thiết lập và do đó bị tấn công. Theo mặc định, trình gỡ lỗi sẽ dừng trên điểm dừng bất cứ khi nào nó bị tấn công. Điều này có nghĩa là khi bạn thực hiện một bước, tất cả các luồng được phép chạy và một trong các luồng đang chạy của bạn đạt điểm dừng này trước khi bước hoàn thành trên luồng hiện tại của bạn. Lần tới khi bạn gặp tình huống này, hãy thử điều này:

  1. Vô hiệu hóa hoặc xóa điểm dừng đã bị tấn công bởi luồng mới mà trình gỡ lỗi đã chuyển sang.
  2. Nhấn Tiếp tục (F5)
  3. Quan sát cách bước đầu tiên đầu tiên của bạn trên luồng đầu tiên đó hoàn thành và bây giờ là bối cảnh gỡ lỗi hoạt động.
  4. Vì các điểm dừng của bạn bị xóa hoặc vô hiệu hóa, bạn có thể tiếp tục bước trên chuỗi đó mà không bị gián đoạn.

7 bản hack ít được biết đến để gỡ lỗi trong Visual Studio

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.