2009-07-18 33 views
26

Khác hơn là tôi không biết nếu tôi có thể tái sản xuất nó ngay bây giờ mà nó đã xảy ra (tôi đã sử dụng ứng dụng cụ thể này trong một hoặc hai tuần mà không có vấn đề), giả sử rằng tôi đang chạy ứng dụng của tôi trong trình sửa lỗi VS , làm thế nào tôi nên đi về gỡ lỗi bế tắc sau khi nó xảy ra? Tôi nghĩ rằng tôi có thể nhận được tại ngăn xếp cuộc gọi nếu tôi tạm dừng chương trình và do đó xem nơi các chủ đề khác nhau đã xảy ra, nhưng nhấp vào tạm dừng chỉ ném Visual Studio vào bế tắc quá cho đến khi tôi giết ứng dụng của tôi.Làm cách nào để gỡ lỗi bế tắc?

Có cách nào khác ngoài cách duyệt qua cây nguồn của tôi để tìm các vấn đề tiềm ẩn không? Có cách nào để nhận cuộc gọi ngăn xếp khi sự cố đã xảy ra để xem vấn đề ở đâu không? Bất kỳ công cụ/mẹo/thủ thuật nào khác có thể hữu ích?

Trả lời

9

Bạn đã làm đúng cách. Nếu Visual Studio cũng deadlocks, điều đó xảy ra bây giờ và sau đó. Nó chỉ là may mắn, trừ khi có một số vấn đề khác.

Bạn không phải chạy ứng dụng trong trình gỡ lỗi để gỡ lỗi nó. Chạy ứng dụng bình thường, và nếu bế tắc xảy ra, bạn có thể đính kèm VS sau này. Ctrl + Alt + P, chọn quy trình, chọn loại trình gỡ lỗi và nhấp đính kèm. Sử dụng một tập hợp các loại trình gỡ lỗi khác có thể làm giảm nguy cơ bị lỗi VS (đặc biệt nếu bạn không gỡ lỗi mã gốc)

Một bế tắc liên quan đến 2 hoặc nhiều luồng.Bạn có thể biết cái đầu tiên (có lẽ là chuỗi giao diện người dùng của bạn) vì bạn nhận thấy bế tắc trong ứng dụng của mình. Bây giờ bạn chỉ cần tìm một cái khác. Với kiến ​​thức về kiến ​​trúc, nó phải là dễ dàng để tìm thấy (ví dụ như những gì đề khác sử dụng ổ khóa giống nhau, tương tác với giao diện người dùng vv)

Nếu VS không làm việc ở tất cả các , bạn luôn có thể sử dụng windbg . Tải xuống tại đây: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

0

Bạn có thể sử dụng các chương trình khác nhau như Intel (R) Thanh tra song song:
http://software.intel.com/en-us/intel-parallel-inspector/

chương trình như vậy có thể cho bạn địa điểm trong mã của bạn với deadlocks tiềm năng. Tuy nhiên bạn nên trả tiền cho nó, hoặc chỉ sử dụng nó trong thời gian đánh giá. Không biết nếu có bất kỳ công cụ miễn phí như thế này.

+0

Dường như cũng chỉ dành cho C/C++ (không được quản lý mà tôi giả định, vì không có C được quản lý theo như tôi biết). –

3

Tôi muốn thử các cách tiếp cận khác nhau theo thứ tự sau:

-Trước hết, kiểm tra mã để tìm kiếm các vi phạm thread-an toàn, đảm bảo rằng các khu vực quan trọng của bạn không gọi các chức năng khác mà lần lượt sẽ cố gắng để khóa một khu vực quan trọng.

-Sử dụng bất kỳ công cụ nào bạn có thể bắt tay để trực quan hóa hoạt động của luồng, tôi sử dụng tập lệnh perl trong nhà phân tích nhật ký hệ điều hành mà chúng tôi đã thực hiện và đồ thị tất cả ngữ cảnh chuyển đổi và hiển thị khi chuỗi được làm trống trước.

-Nếu bạn không thể tìm thấy một công cụ tốt, hãy thực hiện một số thao tác ghi nhật ký để xem các chủ đề cuối cùng đang chạy trước khi bế tắc xảy ra. Điều này sẽ cung cấp cho bạn manh mối về vấn đề có thể gây ra, nếu cơ chế khóa có tên duy nhất, như thể đối tượng có chủ đề riêng, hãy tạo semaphore chuyên dụng hoặc mutex chỉ để quản lý chuỗi đó.

Tôi hy vọng điều này sẽ hữu ích. Chúc may mắn!

+0

Trên ghi chú đăng nhập, tôi thực sự cần phải học cách sử dụng log4net đúng cách ... –

0

Cũng giống như bất cứ nơi nào, không có công cụ "Silver bullet" nào để nắm bắt tất cả các deadlocks. Đó là tất cả về chuỗi trong đó các chủ đề khác nhau chứa đựng tài nguyên để công việc của bạn là tìm ra nơi mà trật tự đã bị vi phạm. Thông thường Visual Studio hoặc trình gỡ lỗi khác sẽ cung cấp dấu vết ngăn xếp và bạn sẽ có thể tìm ra nơi khác biệt là. DevPartner Studio cung cấp phân tích bế tắc nhưng lần cuối tôi đã kiểm tra có quá nhiều kết quả dương tính giả. Một số công cụ phân tích tĩnh sẽ tìm thấy một số deadlocks tiềm năng quá.

Ngoài ra, nó giúp kiến ​​trúc trực tiếp thực thi thứ tự thu hút tài nguyên. Ví dụ, phân lớp giúp đảm bảo khóa cấp trên được thực hiện trước những khóa thấp hơn nhưng hãy cẩn thận với các cuộc gọi lại.

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