Trong vài tháng qua, tôi đã nhận được một vài báo cáo từ QA về một trong các dịch vụ của chúng tôi bị treo. Sau khi kiểm tra một bãi chứa hang bằng cách sử dụng WinDbg, mỗi khi tôi phát hiện ra cùng một điều: Loader khóa phần quan trọng bị khóa nhưng sở hữu thread là hư không được tìm thấy. Kể từ khi thread đã biến mất và dấu vết duy nhất mà tôi có thể thấy là một phần quan trọng toàn cầu nó để lại phía sau, tôi không thấy mã chạy trên chuỗi chủ đề, hoặc thậm chí những gì mà chuỗi đó đến từ, nó có thể thậm chí không phải là một trong của chúng tôi (tức là nhà cung cấp bên thứ ba).Tìm kiếm ý tưởng gỡ lỗi một cửa sổ dịch vụ khởi động khó khăn gremlin
Vấn đề này rất lẻ tẻ, chỉ nhìn thấy nó có thể 3-4 lần trong 6 tháng qua xảy ra tự nhiên trong tự nhiên. Tất cả các lần khác, dịch vụ chạy hoàn hảo. Vì vậy, điều này làm cho tôi tin rằng đó là một số loại điều kiện thời gian/chủng tộc.
Gần đây, tôi đã quyết định tự mình thực hiện điều này. Tôi thiết lập một máy tính với kịch bản WinTask liên tục bắt đầu/dừng dịch vụ nói trên. Tin tốt là trong vòng 5-6 giờ tôi có thể tái tạo vấn đề.
Bây giờ cho phần tiếp theo: làm cách nào để cô lập?
Đây là những gì tôi đã cố gắng cho đến nay:
sử dụng "gỡ rối" lĩnh vực trong cài đặt gflags ảnh để Automagically chạy dịch vụ dưới cdb bất cứ khi nào nó bắt đầu. Cho đến nay điều này đã được chạy trong hai ngày và không bao giờ treo, vì vậy tôi đang suy nghĩ gỡ lỗi giới thiệu vừa đủ của một sự thay đổi thời gian để làm cho vấn đề vô hình.
Trình xác minh ứng dụng đã tải xuống và định cấu hình quy trình để chạy với điều đó. Tìm thấy một lỗi hoàn toàn không liên quan nơi chúng tôi tạo biến tạm thời CComBSTR, gán nó cho biến thể và chuyển biến thể vào một cuộc gọi hàm mặc dù CComBSTR đã xóa chuỗi được phân bổ theo điểm đó. Đừng tin rằng lỗi này là có liên quan bởi vì chuỗi là chỉ đọc và thread nó đang chạy trên không phải là một trong đó là chết.
Tôi đang tạo bài đăng này trong trường hợp các bạn có thể nghĩ về điều gì đó mà tôi không xem xét.
Tôi mặc dù có một cửa sổ tiện ích mà giả tạo đặt tải trên CPU và làm những việc khác để làm cho điều kiện chủng tộc bật lên và tôi nghĩ rằng ứng dụng xác minh đã làm một điều như vậy, nhưng dường như nó không. Có ai biết tôi đang làm gì không, hay tôi chỉ mơ ước điều đó?
Trừ khi điều gì đó xảy ra vào cuối tuần, bước tiếp theo của tôi là vô hiệu hóa tất cả các trình gỡ rối, quay lại kho và hack một trong những DllMains để ghi lại các sự kiện THREAD_ATTACH/THREAD_DETACH. Ít nhất tôi sẽ có thể chặn sợi chỉ đang chết khi nó được tạo ra. Điều đó có thể làm sáng tỏ.
-1 ?? tại sao?? tôi không hiển thị đủ chi tiết? có vẻ như tôi không làm đủ nghiên cứu? làm mọi người không hỏi stackoverflow khi họ nhận được stumped bởi các vấn đề phát triển phần mềm? – DXM
Vâng, đây là một câu hỏi hoàn toàn hợp lệ. Điều duy nhất sẽ làm cho nó tốt hơn sẽ được đăng một số mã. Tôi cho rằng đó là lý do tại sao một người nào đó lái xe bằng cách bỏ phiếu. –
Đó là một ứng dụng sản xuất đã có mặt trên thị trường hơn 10 năm. Tôi thậm chí không biết những gì DLL đang gây ra vấn đề, hãy để một mình gửi mã nguồn công ty mã nguồn mở trực tuyến, ngay cả khi tôi có thể sao chép/dán 5M dòng mã nguồn. Không có ý tưởng gì thay đổi, nhưng lần đầu tiên tôi nhìn thấy vấn đề khoảng 6 tháng trước đây. – DXM