2009-06-18 36 views
5

Tôi gặp sự cố gỡ lỗi đa luồng khá nghiêm trọng. Tôi có một số loại vấn đề thời gian khi tương tác với một thiết bị nối tiếp, và tôi cần phải theo dõi nó. Tôi có ba chủ đề:Gỡ lỗi luồng trong C# và vs2008

  1. Chủ đề chính cho cập nhật giao diện người dùng. Người dùng có thể thay đổi một tham số của thiết bị hoặc nhiều thông số cùng một lúc bằng cách chọn giá trị đặt trước.
  2. Chuỗi kiểm tra trạng thái truy vấn để đảm bảo rằng thiết bị vẫn được đính kèm. Nếu người dùng tắt thiết bị hoặc chính thiết bị được tương tác một cách thú vị, các thay đổi trạng thái cần được phản ánh trong giao diện người dùng.
  3. Chủ đề đọc cổng nối tiếp mà thiết bị phản hồi.

Vấn đề của tôi thực sự liên quan đến việc gỡ lỗi tình huống này. Dường như mọi dòng đơn tôi có trong mỗi luồng phải có điểm ngắt để được sửa lỗi; nếu tôi phá vỡ trong một chủ đề, trình gỡ lỗi sẽ không bước qua chuỗi đó. Tôi hiểu rằng các chủ đề khác sẽ tiếp tục cập nhật, nhưng không nên các chủ đề tôi đang thực hiện như bình thường trong trình gỡ lỗi, tức là, đi từ một dòng để tiếp theo? Sau đó, tôi có thể sử dụng tab 'chủ đề' để chuyển đổi giữa các chuỗi.

Tôi đề cập đến rằng tôi đang ở trong WPF bởi vì tôi không biết liệu điều đó có thay đổi hoàn cảnh hay không; có lẽ nó không, có lẽ nó không. Chuỗi kiểm tra trạng thái là một phần của điều khiển giao diện người dùng, vì trạng thái chỉ cần được kiểm tra trong khi giao diện người dùng đang hoạt động. Điều khiển đó nằm trong một thư viện riêng biệt với ứng dụng chính.

+0

Loại bỏ các tham chiếu WPF gây ra nó không thực sự liên quan đến WPF - chỉ gỡ lỗi MT chung. –

+0

Thật không may, tôi đã nhận thấy rằng vs2008 đã bắt đầu hành động rất, rất wonkily (đây chỉ là một vấn đề hành vi, những người khác phải làm với kiểm soát nguồn và cài đặt xây dựng khác nhau) đã xảy ra kể từ khi dự án di chuyển đến WPF. Do đó sự bao gồm, chỉ trong trường hợp. – mmr

Trả lời

1

Nếu mã của bạn là bước đơn một cách kỳ lạ, đôi khi mã này có thể do tệp pdb bị hỏng đơn giản gây ra. Một "xây dựng lại tất cả" trên mã của bạn sẽ tái tạo nó từ đầu và chữa bất kỳ ổn định như vậy.

Một điều cần nhớ là dừng một luồng trong trình gỡ lỗi có thể gây ra tất cả các loại thời gian bất thường mà bạn sẽ không thấy trong bản dựng. Ví dụ:

  • cảng nối tiếp sẽ luôn luôn tiếp tục hoạt động (về mặt kĩ phần cứng/lái xe) trong khi bạn đã dừng lại trên một breakpoint - khi bạn tiếp theo cố gắng bước mã của bạn, nó có thể nhận được một vụ nổ khổng lồ đột ngột Dữ liệu. Với các cuộc gọi lại không đồng bộ, điều này có thể là "thú vị".

  • Dừng một luồng làm rối loạn thời gian bình thường để đồng bộ hóa chuỗi chỉ với thread có thể bị hỏng.

7

Khi trình gỡ lỗi dừng trên điểm ngắt, theo mặc định nó sẽ tạm dừng tất cả các chuỗi khác. Nhưng khi bạn bước hoặc tiếp tục tất cả 3 chủ đề được tiếp tục. Khi bạn bước qua mã, trình gỡ rối về cơ bản thiết lập một điểm ngắt tạm thời trên dòng tiếp theo và tiếp tục tất cả các luồng. 2 người khác có thể có cơ hội để chạy trước khi điểm ngắt ảo đó được nhấn.

Bạn có thể Freeze các chủ đề khác trong khi gỡ lỗi

Khi bạn đang ở một breakpoint chọn Debug | Windows | Chủ đề. Chọn chủ đề bạn không quan tâm và nhấp chuột phải, chọn Freeze. Điều này sẽ cho phép bạn tập trung vào một chủ đề mà bạn đang bước qua.

+0

nhưng quan điểm của tôi là nó không chạm vào điểm ngắt tạm thời đó; nó chỉ tiếp tục một cách thẳng thắn, không đụng đến điểm ngắt nào khác với điểm gốc. Tôi muốn các chủ đề khác đang chạy; Tôi muốn có thể nhìn thấy nơi họ cư xử sai. – mmr

+0

Điều gì xảy ra khi bạn tự ngắt sau khi bước? Là nó bị mất trong một phương pháp Win32 một nơi nào đó hoặc nó thực sự dừng lại ở một số điểm sau đó trong mã của bạn? –

+0

nó không bao giờ dừng lại, nó chỉ tiếp tục. – mmr

1

Tôi với Jason, bước sẽ không hiển thị sự thật nữa.

Bạn thực sự tốt hơn khi tắt mỗi dòng mã bằng một phương pháp cũng tăng bộ đếm bằng cách sử dụng Interlocked.Increment và thêm bộ đếm vào đầu ra (tệp cục bộ là tốt nhất).

Bộ đếm là cần thiết vì thứ tự của các sự kiện thực tế không phải lúc nào cũng giống như thứ tự ghi vào tệp. Tên các chủ đề hoặc sử dụng giá trị ID trong đầu ra, quá. Tôi sử dụng MS Excel để mở tệp và tô màu tất cả các hàng tùy thuộc vào chuỗi, theo cách này tôi có thể thấy các hoạt động xen kẽ rất rõ ràng.

Tôi thậm chí đã viết một trình bao bọc để khóa {} các công cụ nào khi mỗi khóa bật/tắt.

Vấn đề đồng bộ rất kinh khủng khi chụp hình, vì vậy tôi khuyên bạn không nên chi tiêu nhiều hơn số tiền cần thiết để tái cấu trúc. Đôi khi nó chỉ ra rằng cách tiếp cận bạn đang dùng là phụ tối ưu.

Hãy nhớ sử dụng dễ bay hơi khi cần thiết với IO.

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