2009-11-17 32 views
7

Định kỳ chúng tôi bị treo khi tắt dịch vụ Windows trong môi trường sản xuất mà chúng tôi không thể tái tạo. Có thể là vài tháng trước khi nó xảy ra lần nữa.Lấy từ ProcessThread đến một luồng được quản lý

Tôi đang đưa ra một số chẩn đoán để thử và trợ giúp về vấn đề này, một điều tôi đang xem là thêm sự kiện vào nhóm luồng hệ thống trong 60 giây sau khi chúng tôi bắt đầu tắt ứng dụng. Ứng dụng của chúng tôi sẽ tắt hoàn toàn trong vòng 10 giây tối đa.

Trong trường hợp này, tôi muốn theo dõi các luồng đang chạy còn lại của quá trình tới nhật ký sự kiện.

Tôi có thể lấy các chuỗi đang chạy bằng System.Diagnostics.Process.GetCurrentProcess.Threads. Các chủ đề này có các chuỗi chủ đề Win32 của v.v.

Tôi đã tự hỏi liệu có cách nào lấy lại từ các id luồng này đến bất kỳ luồng được quản lý nào mà chúng đại diện trong quy trình hiện tại hay không. Lý do tôi đang cố gắng làm điều này là bởi vì đối với các hồ chủ đề của chúng tôi và các chủ đề khác, chúng tôi sinh ra chúng tôi cung cấp cho các tên đại diện cho mục đích của họ và nó sẽ thực sự giúp đỡ để có được những trở lại.

+0

Có ai đã từng tìm ra cách để làm điều này, 3 năm sau? –

+0

Xin chào Bruno, về cơ bản là không thể. – Bigtoe

+1

Bạn đã gán tên cho các chủ đề trong nhóm chủ đề như thế nào? IMHO không thể thực hiện được. –

Trả lời

11

Điều này là không thể vì lý do sau. Quote from MSDN:

Một hệ điều hành threadid không có mối quan hệ cố định vào một quản lý chủ đề, bởi vì một máy chủ không được quản lý có thể kiểm soát mối quan hệ giữa đề quản lý và không được quản lý. Cụ thể, một máy chủ tinh vi có thể sử dụng API CLR Hosting để lập lịch nhiều chuỗi được quản lý dựa trên cùng một chuỗi hệ điều hành hoặc di chuyển một chuỗi được quản lý giữa các luồng hệ điều hành khác nhau.

Vì vậy, không có ánh xạ một-một giữa các chuỗi được quản lý và chuỗi hệ điều hành.

Vì vậy, bây giờ câu hỏi trở thành, làm thế nào để có được một danh sách tất cả các luồng được quản lý hiện đang chạy trong tiến trình hiện tại? Thật không may tôi không biết câu trả lời.

+0

Cảm ơn Darin. Tôi đã tự mình đạt được kết luận đó khi đọc trên web. Đã hy vọng một ai đó ra khỏi đó có thể đã biết một chút phép thuật để ném vào vấn đề này mà có thể đã thực hiện các trick.Tôi hiện đang truy tìm tất cả thông tin về luồng không được quản lý mà tôi có thể thực hiện được. Sẽ xem xét việc đưa vào thông tin tương tự cho tất cả các chuỗi được quản lý tại thời điểm tạo nơi tôi có quyền truy cập vào chức năng đó. Hy vọng rằng tôi sẽ nhận được một số mối tương quan giữa chúng. – Bigtoe

+1

"cách nhận danh sách tất cả chuỗi được quản lý hiện đang chạy trong quy trình hiện tại" - có thể với trình gỡ lỗi, ví dụ: WinDbg + SOS ('! Threads') –

+0

[một vấn đề tương tự và câu trả lời cho thấy cách liệt kê các luồng được quản lý và tìm kiếm thông qua stacktraces của chúng] (http://stackoverflow.com/a/35558240/717732) – quetzalcoatl

0

Nó không giống như thế này là có thể.
May mắn cho chúng tôi chúng tôi có thư viện luồng riêng của chúng tôi bao bọc các thư viện .NET và tôi đã có thể đưa vào chức năng để giữ một danh sách các chủ đề đang hoạt động mà chúng tôi có thể sử dụng cho các chẩn đoán này.
Điều này hoạt động khá tốt nhưng có một chút công bằng tham gia và thử nghiệm tất nhiên, nhưng hy vọng chúng tôi sẽ nhận được o dưới cùng của nó.

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