2015-12-23 16 views
5

Dấu vết ngăn xếp cho NullReferenceException rất không rõ ràng, chúng chỉ bao gồm tên phương thức và ngăn xếp cuộc gọi. Bất kỳ biến nào trong một phương thức đều có thể là null và thật khó để gỡ lỗi khi lỗi không thể tái tạo trên máy tính dev.Lấy tên biến cho NullReferenceException

Bạn có biết cách để biết thêm thông tin về lỗi đó, có thể nhận tên biến không? Hay bạn có cách nào tốt hơn để gỡ lỗi nó?

+1

Bạn không thể có được tên biến. Bạn có thể xác định dòng nơi xảy ra ngoại lệ. – Alex

+0

@Alex Có nhưng trong quá trình sản xuất yêu cầu phân phối tệp .pdb. Và điều này cũng ngăn cản việc sử dụng obfuscators. – Elmo

+4

@Elmo Chúc may mắn sau đó. Nếu bạn đang sử dụng obfuscators, dấu vết stack sẽ là rác. –

Trả lời

9

Việc theo dõi tên đó không phải lúc nào cũng có thể (có thể là biểu thức).
Và nếu có thể, nó sẽ phải chịu chi phí không thể chấp nhận. Hãy xem xét rằng thời gian chạy sẽ phải theo dõi gần như tất cả các biến tham chiếu, điều đó sẽ tốn kém và cấm tất cả các loại tối ưu hóa.

Ngoài ra, hãy xem câu trả lời của tôi trên Inspect the managed stack và bài đăng trên blog mà nó đề cập đến.

Giải pháp đơn giản là xây dựng trong hơn rỗng phù hợp kiểm tra trong mã của riêng bạn:

void Foo(Bar b) 
{ 
    if (b == null) throw new ArgumentNullException(nameof(b)); 

    ... 
} 
+0

Đặc biệt hữu ích nếu bạn bao gồm 'Debug.AssertNonNull' (hoặc bất cứ điều gì nó nên được) chỉ để kiểm tra sanity như bạn gỡ lỗi sau này. –

+0

vấn đề về chi phí trong trạng thái gỡ lỗi là gì? –

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