2009-05-20 24 views
15

Tôi đang phát triển một phần bổ trợ cho AutoCAD 2009. Đầu ra của dự án là một thư viện lớp. Khi tôi cố gắng để gỡ lỗi và tải thư viện lớp, tôi nhận được thông báo "LoaderLock đã được phát hiện." Tôi đã viết những tiện ích này trong một thời gian và đây là thông điệp đầu tiên của loại hình này tôi đã nhìn thấy.Tại sao tôi nhận được cảnh báo "LoaderLock được phát hiện" khi gỡ lỗi?

  1. Tôi bắt đầu cố gắng tìm hiểu điều này ở đâu?
  2. LoaderLock là gì và tại sao nó làm phiền tôi bây giờ?

Trình phát hiện đã được phát hiện Thông báo: Cố gắng thực hiện được quản lý bên trong khóa Trình tải hệ điều hành. Không cố gắng chạy mã được quản lý bên trong một hàm DllMain hoặc khởi tạo hình ảnh vì làm như vậy có thể khiến ứng dụng bị treo.

Tôi đã đi đến Debug -> Exceptions -> "Managed Debugging Assistants", được tìm thấy "LoaderLock" và bỏ chọn hộp kiểm "Thrown".

Tôi có thể gỡ lỗi lại nhưng tôi đã làm gì và tại sao tôi phải làm điều đó? Điều này có gây ra các vấn đề khác cho tôi không?

Trả lời

16

Khóa bộ nạp là khóa toàn bộ quy trình được hệ thống sử dụng để đồng bộ hóa quyền truy cập để tải DLL vào không gian địa chỉ quy trình. Chức năng tải DLL, DLL miễn phí, truy vấn thông tin DLL, v.v., tất cả đều có khóa bộ nạp. Điều thường ảnh hưởng đến các nhà phát triển nhất là khóa bộ nạp được giữ trong khi DllMain cũng đang chạy - điều này có nghĩa là một khóa hệ điều hành mà bạn thường không biết có thể được giữ trong khi chạy mã của bạn.

Khóa trình tải có thể được xem ở mức rất thấp trong cấu trúc phân cấp khóa. Mã chạy dưới khóa bộ nạp trong DllMain có thể là nguyên nhân gây ra các bế tắc. Ví dụ, CLR có bộ khóa nội bộ riêng của nó mà nó có thể giữ trong khi tải DLL. Nếu bạn gọi mã được quản lý từ bên trong DllMain của mình, bạn có thể khiến CLR trên luồng của mình lấy được một trong các khóa này trong khi giữ khóa bộ nạp. Nếu CLR trên thread khác đã có được khóa đó (gây ra các thread gốc trong DllMain để chặn) và sau đó đã cố gắng để tải một DLL mà sẽ có được khóa loader, quá trình của bạn sẽ bế tắc.

Có vẻ như CLR đang cố gắng phát hiện trước việc chạy mã được quản lý trong khóa trình tải. Khi bạn thấy ngăn xếp từ lỗi này trong trình gỡ lỗi, hãy xác định điều gì đang khiến mã được quản lý của bạn chạy từ bên trong DllMain và xóa nó.

3

Theo kinh nghiệm của tôi với AutoCAD, cảnh báo LoaderLock có thể được bỏ qua một cách an toàn. Nó không phải là một dấu hiệu của mã của bạn làm một cái gì đó sai, nhưng thay vì cảnh báo được nêu ra vì cách AutoCAD được tải và khởi tạo ứng dụng của bạn.

+0

tôi đánh dấu câu trả lời này bởi @ Bojan-Resnik như hữu ích vì nó có khả năng trả lời câu hỏi cuối cùng của OP: Sẽ nguyên nhân này các vấn đề khác cho tôi? Câu trả lời là "có thể không, vấn đề 'có thể' chỉ là một vấn đề gỡ rối, và nó có thể bị bỏ qua." Tôi thấy điều này hữu ích, mặc dù thông tin từ Michael dĩ nhiên cũng rất hữu ích trong việc hiểu vấn đề. – TonyG

1

Đây là một lỗi trong Visual Studio 2005. Đọc bài viết này để biết thêm chi tiết: http://support.microsoft.com/kb/913996

+3

KB đó là một tìm kiếm tốt nhưng tôi thấy lỗi này thường xuyên trong VS2010SP1 khi gỡ lỗi một Excel XLL Addin - đó là những gì đã dẫn tôi đến chủ đề này. – TonyG