2010-05-26 41 views
5

Làm cách nào để theo dõi giá trị của biến khi chúng thay đổi, khi chạy, trong C#? Tôi quan tâm đến cùng một chức năng mà trình gỡ rối cung cấp khi tôi truy tìm một biến thông qua các bước thực hiện, chỉ khi tôi cần gọi nó từ mã của tôi. Một số loại quan trọng-giá trị quan sát, nhưng đối với tất cả các loại biến (cục bộ, lớp, tĩnh, vv), không chỉ các thuộc tính. Vì vậy, về cơ bản, nhận được thông báo khi giá trị của biến thay đổi.Làm thế nào tôi có thể theo dõi một biến tại thời gian chạy trong C#?

+0

Tại sao trình gỡ lỗi không phải là một tùy chọn? Đó là chính xác những gì nó được cho. –

+0

@ 0xA3 Vì tôi cần truy cập các giá trị đó từ bên trong ứng dụng của mình, vào thời gian chạy, chỉ khi chúng thay đổi. – luvieere

+0

Cách viết các giá trị thay đổi của biến vào một tệp nhật ký đơn giản. – Shivam

Trả lời

3

Bạn đang làm việc từ giả định rằng trình gỡ lỗi có thể theo dõi các thay đổi biến. Nó không thể.

Có thể với mã không được quản lý, bộ xử lý có thanh ghi gỡ lỗi dành riêng cho phép thiết lập các điểm ngắt dữ liệu. Lên đến ba được cung cấp. Nó tạo ra một phần cứng gián đoạn khi nó nhìn thấy một vị trí bộ nhớ cụ thể nhận được bằng văn bản. Tuy nhiên, tính năng rất hữu ích này không có sẵn trong mã được quản lý. Bộ thu gom rác hoàn toàn không tương thích với nó, nó di chuyển các đối tượng xung quanh, cho chúng một địa chỉ khác.

Trình gỡ lỗi được quản lý hỗ trợ điều kiện "khi truy cập" trên điểm ngắt, cho phép bạn kết xuất thông tin vào cửa sổ đầu ra. Tuy nhiên, điều đó đòi hỏi một breakpoint, nó không thể được kích hoạt bởi một sự thay đổi trong giá trị biến. Nó cũng thực sự làm chậm quá trình thực thi mã vì trình gỡ lỗi thực sự vào trạng thái ngắt trước khi thực thi điều kiện.

Nơi rõ ràng để đặt điểm ngắt như vậy là trong trình thiết lập thuộc tính. Đó là những gì bạn sẽ cần để thực hiện tính năng này trong mã. Bạn có thể làm bất cứ điều gì bạn muốn trong setter đó, sử dụng lớp Trace chẳng hạn.

+0

⁺¹ cho câu trả lời, tôi tuy nhiên một chút không đồng ý với một điểm của một chậm lớn xuống của một breakpoint có điều kiện đơn giản. Vì C# được chuyển đổi thành mã byte, cách thích hợp nhất cho trình gỡ lỗi là tạo và chèn một mã byte làm in giá trị ở vị trí của giá trị. Tôi không thấy một lý do tại sao nó không thể được thực hiện theo cách này - và do đó thực hiện khác của một breakpoint debugger tôi muốn gọi một lỗi hiệu suất. –

+2

Không, C# được chuyển thành mã máy, IL chỉ là một bước trung gian. Sử dụng Debug> Windows> Tháo gỡ để xem nó. Tính năng, không phải lỗi. –

0

Cách hợp lý duy nhất bạn có thể làm điều đó mà không trình gỡ lỗi sẽ là: không sử dụng một biến, nhưng sử dụng một tài sản, và (có lẽ có điều kiện) thêm dấu vết để setter:

private int myValue; 
public int MyValue { 
    get {return myValue;} 
    set { 
     SomeTraceMethod(myValue, value, ...); 
     myValue = value; 
    } 
} 

Hiển nhiên, điều này không thể được sử dụng cho tùy ý trường/biến.

+0

Trình gỡ lỗi làm như thế nào cho các biến tùy ý? Không có thư viện gỡ lỗi nào có thể giúp tôi đạt được cùng một mức độ theo dõi không? – luvieere

3

Để thêm vào những gì Marc nói, nếu bạn muốn thực hiện điều này cho nhiều thuộc tính và phương pháp, bạn có thể muốn xem kỹ thuật lập trình hướng khía cạnh và thư viện như PostSharp.

http://www.sharpcrafters.com/postsharp

0

Khi những người khác đề cập đến cơ chế như vậy chỉ có ý nghĩa khi sử dụng thuộc tính. Trong .NET, bạn có thể sử dụng giao diện INotifyPropertyChanged.

Đối với một mẫu làm thế nào để thực hiện nó thấy

How to: Implement the INotifyPropertyChanged Interface

Các cuộc đàm phán bài viết tham chiếu rõ ràng về Windows Forms, nhưng bạn không bị ràng buộc vào đó (giao diện được thực khai báo trong không gian tên System.ComponentModel trong System.dll). Trên thực tế, giao diện này được sử dụng rộng rãi cho các kịch bản ràng buộc dữ liệu, ví dụ: trong WPF.

+0

Tôi đã đề cập trong câu hỏi mà tôi quan tâm đến các biến tùy ý, không phải thuộc tính. Tôi biết về INotifyPropertyChanged, những gì tôi không biết là làm thế nào để theo dõi các biến tùy ý, giống như trình gỡ rối. – luvieere

1

Trình gỡ lỗi được quản lý sử dụng API COM ICorDebug cho mọi thứ. Phần mà bạn quan tâm là ICorDebugValue và hậu duệ của nó. Lưu ý rằng LOT của API gỡ lỗi yêu cầu rằng quá trình không chạy (nghĩa là đã gặp phải điểm ngắt) để các kiểm tra khác nhau xảy ra.Tổng quan cấp cao của ICorDebughere. Các tài liệu trên nó là kinda thưa thớt, nhưng một số Googling có thể giúp đỡ. Chúc may mắn.

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