Tôi đang làm việc trên ứng dụng .NET có vẻ như bị rò rỉ bộ nhớ. Tôi biết câu trả lời trong sách giáo khoa, các sự kiện đó phải được hủy đăng ký, các đối tượng dùng một lần nên được xử lý ...Gỡ lỗi rò rỉ bộ nhớ .NET - làm thế nào để biết những gì đang nắm giữ một tham chiếu đến những gì?
Tôi có một dây nịt thử nghiệm có thể tái tạo lỗi. Trong finalizer của một lớp nào đó tôi viết để an ủi
public class Foo
{
// Ctor
public Foo()
{
}
~public Foo()
{
Console.WriteLine("Foo Finalized");
}
}
trong khai thác thử nghiệm, tôi đang tạo ra một trường hợp duy nhất của Foo (mà lần lượt tạo ra và tương tác với hàng trăm loại khác) sau đó loại bỏ nó và viện dẫn Thu gom rác.
Tôi tìm thấy Trình gỡ lỗi Foo không bao giờ được gọi. Tôi có một lớp học tương tự với thiết lập này được hoàn thành như một bài kiểm tra kiểm soát.
Vì vậy, câu hỏi của tôi là thế này:
Làm thế nào tôi có thể xác định bằng các công cụ mã nguồn thương mại hoặc mở chính xác những gì đang nắm giữ một tham chiếu đến Foo?
Tôi có giấy phép chuyên nghiệp cho trình thu thập thông tin bộ nhớ dotTrace nhưng không thể tìm ra từ các tệp trợ giúp về cách sử dụng nó.
Cập nhật: Tôi hiện đang sử dụng dotMemory 4.0, là bộ kế thừa cho bộ nhớ dotTrace (tốt, nhưng không thể sử dụng) 3.5.
nếu bạn đã có trình thu thập thông tin học cách sử dụng nó - Tôi không làm việc với dotTrace rất nhiều nhưng tôi hai khác tương tự trong đó sử dụng các mẫu và cần một số "tham gia" quá – Carsten
@ CarstenKönig +1 cho điều này, Tôi đang đào xung quanh trong dotTrace ngay bây giờ. Tìm ra tôi có thể tìm thấy một danh sách các đối tượng uncollected không gian tên (do đó tìm thấy Foo vi phạm của tôi) và những gì giữ một tham chiếu đến chúng, một lần nữa lọc theo không gian tên (hàng trăm), bây giờ đi qua một danh sách xử lý sự kiện đáng ngờ vv ... –
@ CarstenKönig Trong thực tế, tìm thấy nó bằng cách sử dụng dotTrace! Nó có tính năng để đi sâu vào đồ thị từ gcroot -> Foo, chỉ là một chút khó khăn để tìm. Chúc mừng :) –