2011-11-18 38 views
25

Tôi muốn chỉ có thể thực hiện theo một thao tác của một luồng trong khi gỡ lỗi. Tôi sử dụng một threadpool để debugger giữ chuyển đổi giữa các chủ đề và điều này làm cho gỡ lỗi rất khó chịu.Cách gỡ lỗi chỉ một chuỗi trong Visual Studio

Reading:

tôi nhận được một giải pháp đó là breakpoint có điều kiện (dựa trên tên của chủ đề). Tuy nhiên, tôi không thể nói "thread # 3" sẽ luôn là điều kiện xử lý trường hợp thú vị, vì vậy tôi sẽ phải thay đổi điều kiện cho mỗi lần thực hiện. Quá nhiều công việc.

Một giải pháp khác là sử dụng tính năng đóng băng/làm tan băng để chỉ chạy chuỗi chủ đề thú vị của tôi. Tuy nhiên, điều này làm cho một số thông tin không khả dụng vì tất cả các luồng đều bị tạm dừng.

Điều tôi đang sử dụng bây giờ là đặt chương trình chạy cho đến khi tôi đến điểm dừng nơi tôi chắc chắn sẽ nằm trong chuỗi tốt. Sau đó, tôi tạm dừng tất cả các luồng khác của threadpool và cố gắng tiếp tục thực hiện. Nếu các chương trình có vẻ bị kẹt, tôi tạm dừng và làm tan chuỗi hiện tại.

Giải pháp lý tưởng sẽ tìm đúng chủ đề, gắn cờ nó và sau đó nói với Visual Studio: "chỉ ngắt nếu chuỗi hiện tại bị gắn cờ".

Điều này có thể thực hiện được không?

+0

Vậy tiêu chí cho chuỗi để đột nhập là gì? – abatishchev

+0

tiêu chí sẽ dừng lại là chủ đề bị gắn cờ – kamaradclimber

+0

Kiểm tra mã của bạn trong sự cô lập. Với các bài kiểm tra đơn vị ví dụ. Sau đó, bạn chỉ phải gỡ lỗi tương tác luồng, loại gỡ lỗi mà bạn không * muốn đóng băng luồng. –

Trả lời

2

Tôi sẽ sử dụng các điểm ngắt có điều kiện mà bạn đề cập, nhưng thay vì so sánh với một số chuỗi cố định so sánh với một số biến bán toàn cục (có thể là thuộc tính tĩnh trên lớp chính của bạn?).

Khi bạn xác định chuỗi nào trở nên thú vị, bạn có thể sử dụng cửa sổ ngay lập tức để đặt tên biến và cho phép các điểm ngắt có điều kiện của bạn được nhấn.

+0

có thể là một giải pháp có thể. Tôi nhìn thấy 2 nhược điểm mặc dù: Tôi cần phải sửa đổi codeto của tôi gỡ lỗi nó và tôi cần phải đi qua một (phức tạp) breakpoint thủ tục (1 click vs click, copy-past, 1click) – kamaradclimber

+0

Đối với những người điều chỉnh trong thời gian gần đây (như tôi) tôi đề nghị đọc câu trả lời này [answer để giải thích cách này] (http://stackoverflow.com/a/38926833/1348138) thêm một chút nữa. Tôi cũng khuyên bạn nên bỏ phiếu [đề nghị được đề cập ở đây] (http://stackoverflow.com/a/31191208/1348138). – robert4

6

Trong khi gỡ lỗi bạn có thể đóng băng tất cả các chủ đề trong cửa sổ Chủ đề và tiếp tục chỉ là một trong những bạn đang quan tâm.

+3

cảm ơn nhưng nó không trả lời câu hỏi: Tôi muốn ứng dụng chạy bình thường và chỉ dừng lại trên các điểm ngắt trong một chủ đề – kamaradclimber

1

Một hơi muộn nhưng điều này nảy sinh là câu trả lời đầu tiên trong một tìm kiếm.

tôi sử dụng sau trong VS 2015 ...

var thread = System.Threading.Thread.CurrentThread; 
if (thread.Name == null) 
      thread.Name = "Main"; 

Sau đó, trong breakpoint ...

System.Threading.Thread.CurrentThread.Name == "Main" 

Để làm cho nó linh hoạt hơn bạn có thể nhúng Chủ đề trong một lớp học tùy chỉnh.

FYI: Bạn không thể sử dụng biến tĩnh trong điểm ngắt có điều kiện vì chúng không nằm trong ngữ cảnh. Không bao giờ thực sự hiểu tại sao các thống kê không phải lúc nào cũng trong ngữ cảnh.

+0

cảm ơn câu trả lời của bạn (thậm chí là muộn), nơi bạn sẽ thêm đoạn mã đầu tiên để đặt tên cho chuỗi? (Tôi đã đề cập việc thêm mã này vào mã sẽ yêu cầu biết trước chuỗi mà tôi muốn theo dõi) – kamaradclimber

+0

@kamaradclimber. Sớm nhất có thể. Bạn chỉ có thể đặt tên chuỗi một lần hoặc có ngoại lệ. Bạn có thể đặt thread.Name bằng tay trong gỡ lỗi. Bạn cũng có thể nói nếu thread.name == xxx System.Diagnostics.Debugger.Break() – Paulustrious

+0

Xin lỗi .. thời gian chờ 5 phút. @kamaradclimber. Sớm nhất có thể. Bạn chỉ có thể đặt tên chuỗi một lần hoặc có ngoại lệ. Bạn có thể thiết lập thread.Name bằng tay trong debug hoặc chỉ System.Threading.Thread.CurrentThread.Name = "xyz". Bạn cũng có thể nói ... if (thread.name == xxx) {System.Diagnostics.Debugger.Break();}. Bạn có thể cho nhiều chủ đề cùng tên nếu bạn muốn. Trong quá khứ tôi đã thêm mã dọc theo các dòng của bool stop = thread.Name == "someName" và sau đó trong breakpoint gỡ lỗi bạn chỉ có thể đặt điều kiện 'stop'. Làm cho cuộc sống dễ dàng hơn – Paulustrious

Các vấn đề liên quan