2011-07-25 37 views
5

tôi có vấn đề với từng bước gỡ rối của một ứng dụng .NET đa luồng trong Visual Studio 2008.Gợi ý để gỡ lỗi một ứng dụng đa luồng

Với mỗi bước đường, Visual Studio càng lúc càng chậm (phải mất nhiều và nhiều thời gian hơn để chuyển sang dòng tiếp theo) và thường bị treo sau một vài dòng (tôi nhận được mẹo "Visual Studio đang bận") và tôi cần phải ngừng gỡ lỗi. Tôi nghi ngờ vấn đề là do thực tế là ứng dụng có một số máy khách TCP/IP được kết nối, có nghĩa là mỗi khi tôi tạo điểm ngắt, bộ đệm mạng của chúng sẽ được lấp đầy cho đến khi tôi tiếp tục ứng dụng của mình. Bất cứ khi nào tôi sử dụng F10 để chuyển sang dòng mã tiếp theo, Visual Studio ngay lập tức đánh thức tất cả các luồng khác để chúng xử lý dữ liệu đầu vào.

Có ai có kinh nghiệm về các vấn đề như vậy và các đề xuất về cách tránh chúng không?

+1

Có thể nhật ký tốt sẽ tốt hơn không? Hoặc thử gỡ lỗi với điều kiện ... – acoolaum

+1

Tôi sử dụng ghi nhật ký (log4net) và tôi thường sử dụng các kiểm tra đơn vị để kiểm tra ứng dụng. Nhưng bây giờ thì tôi cần tạo một điểm dừng ở đâu đó. Breakpoint * có thể * có điều kiện (nếu đó là những gì bạn có nghĩa là), nhưng điều đó không thay đổi thực tế là tôi khó có thể thực hiện hai dòng tiếp theo mà không cần VS treo. Cho đến nay, tôi sẽ mất bình tĩnh và thêm một loạt các bản sửa lỗi vào nhật ký trong suốt phương pháp, và sau đó làm việc từ đó. Nhưng nó không có ý nghĩa để không thể sử dụng một trình sửa lỗi đúng cách. – Groo

Trả lời

7

Đây không phải là một nhiệm vụ dễ dàng chút nào, tôi tin rằng bạn hiểu điều này. Vì vậy, rất quan trọng để có một sự hiểu biết rõ ràng về cơ chế luồng và đồng bộ hóa được cung cấp bởi .NET Framework. Chỉ sau khi thực hiện việc này, bạn có thể bắt đầu thiết kế đồng bộ hóa và quản lý chuỗi.

Tôi sẽ đề nghị xác định tên rõ ràng cho chủ đề của bạn và giới thiệu ghi nhật ký rộng, log4net sẽ là lựa chọn tốt vì cung cấp cho bạn một công cụ ghi nhật ký an toàn và mạnh mẽ.

Visual Studio lời khuyên:

Xem thêm ở đây: Debugging Multithreaded Applications

EDIT: nhập thêm lời khuyên

Cố gắng xác định trạng thái logic ứng dụng thực sự hữu ích để được sửa lỗi bằng tay và sử dụng breakpoint có điều kiện nếu nó là tốt để bạn có thể tránh phá vỡ thêm debugger:

2

Như acoolaum đã chỉ ra, tốt hơn là sử dụng nhật ký được định thời gian để xem bất kỳ ngoại lệ hoặc báo cáo sự cố nào. Ngoài ra, bạn có thể thêm trình biên dịch có điều kiện để sử dụng các đường dẫn thay thế không gây ra bất kỳ sự gác máy nào. Ví dụ, khi gỡ lỗi các hàm dựa vào việc nhận thông tin từ TCP/IP, hãy sử dụng một hàm mô hình mà chỉ trả về chuỗi mà không thực sự thực hiện bất kỳ giao tiếp TCP/IP nào.

Có thư viện được tạo chỉ để thực hiện việc mô phỏng kiểu này. Bạn có thể muốn kiểm tra một trong số đó.

1

gợi ý này có thể một shot dài, nhưng ở đây tôi đi: Bất kỳ cơ hội các ứng dụng bạn đang cố gắng để gỡ lỗi là một ứng dụng WinForms, và bạn có một cửa sổ xem mở?

Trước đây, trước khi tôi ngừng sử dụng Đồng hồ Windows gần như hoàn toàn, tôi nhớ đã gặp phải trường hợp chậm hơn-n-chậm hơn của bạn.Tôi có thể lặp lại nó nếu điểm ngắt của tôi bị tấn công trong bối cảnh của chuỗi không phải UI, và việc bỏ qua các giá trị của cửa sổ đồng hồ bao gồm các giá trị ràng buộc UI, trình gỡ rối sẽ âm thầm nuốt các ngoại lệ chéo, và nó sẽ chậm hơn và chậm hơn và chậm hơn cho đến khi nó không sử dụng được.

Cửa sổ đóng đồng hồ đã loại bỏ hoàn toàn độ trễ.

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