2010-06-15 4 views
6

Vào cuối ứng dụng DirectX của tôi, tôi nhận được "Thiết bị Direct3D có số tham chiếu khác không, nghĩa là một số đối tượng không được phát hành." Ứng dụng này lớn và không được viết bởi tôi, làm thế nào tôi có thể đi về việc gỡ lỗi những tài nguyên nào không được phát hành?DirectX 10 Resource Leak

Trả lời

1

Bạn có thể sử dụng tiện ích Bảng điều khiển DirectX như được mô tả here. Bật hộp kiểm "Break on Memory Leaks", sau đó bạn có thể sử dụng "Break on AllocID" để tìm tài nguyên nào không được giải phóng.

+2

Có cách nào để thực hiện công việc này với DX10 không? – yxk

+0

Trả lời không liên quan đến DX10, chỉ áp dụng cho DX9 khi người hỏi yêu cầu rõ ràng thông tin DX10. – IneQuation

6

Bước đầu tiên là sử dụng DirectX debug DLLs, via the DirectX Control Panel. (IIRC, đây là một mục tùy chọn khi bạn cài đặt DirectX SDK, vì vậy bạn có thể cần phải cài đặt chúng.)

Khi bạn chạy ứng dụng tiếp theo, DirectX sẽ cung cấp cho bạn thêm thông tin về những gì đang bị rò rỉ. Cụ thể, bạn sẽ muốn tìm kiếm một dòng như thế này:

D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x1c17 to debug 
               allocation id ^^^^^^ 

Hoặc, như thế này:

Direct3D9: (WARN) :Memory Address: 00385580 lAllocID=1 dwSize=000047f8, (pid=00000474) 
             allocation id^

Một khi bạn có một id phân bổ, bạn có thể nói với DirectX để phá vỡ khi phân bổ xảy ra trong chương trình của bạn, bằng cách đặt cài đặt Break on AllocID trong Bảng điều khiển DirectX (hoặc bằng cách đặt khoá đăng ký được đề cập ở trên).

Sau đó, đó là vấn đề kiểm tra callstack để xem cuộc gọi DirectX có liên quan gì.

+2

Phương pháp này có hoạt động với DX10 không? Tôi không thấy bất kỳ thông báo cảnh báo nào – yxk

+0

Trả lời không liên quan đến DX10, chỉ áp dụng cho DX9 khi người hỏi yêu cầu rõ ràng thông tin DX10. – IneQuation