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#?
Trả lời
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.
⁺¹ 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. –
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. –
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.
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
Để 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.
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
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.
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
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 ICorDebug
là here. 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.
- 1. Làm thế nào để tạo dấu thời gian theo dõi
- 2. C#: Làm thế nào tôi có thể nhận được thời gian hiện tại thành một chuỗi?
- 3. làm thế nào tôi có thể nhận được thời gian hiện tại trong C#?
- 4. Ứng dụng C# có theo dõi thời gian chạy của ứng dụng C# không?
- 5. Theo dõi thời gian một lệnh có trong UNIX/LINUX?
- 6. Tại sao tôi không thể thay đổi biến long_query_time biến tại thời gian chạy
- 7. Biến số SSIS tại thời gian chạy
- 8. Kiểm tra xem hằng số có được xác định tại thời gian chạy theo Obj-C
- 9. Làm cách nào để theo dõi đường dây gây ra lỗi thời gian chạy?
- 10. Trong Python luồng, làm thế nào tôi có thể theo dõi hoàn thành một sợi?
- 11. C# Làm thế nào để đổ tất cả các biến và giá trị hiện tại trong thời gian chạy
- 12. làm thế nào để theo dõi một cách sử dụng bộ nhớ quá trình theo thời gian - ubuntu
- 13. Tính thời gian chạy Cron tiếp theo trong C#
- 14. Thời gian theo dõi Chi tiêu trong Debugger
- 15. Làm thế nào để có được NHibernate tạo ra SQL trong mã tại thời gian chạy?
- 16. Theo dõi thời gian cho Redmine?
- 17. Làm thế nào tôi có thể chuyển đổi một dấu thời gian ISO8601 thành thời gian unix trong Perl?
- 18. Theo dõi các thay đổi về mã theo thời gian
- 19. Theo dõi mức âm thanh micrô theo thời gian thực
- 20. "Inlining" (loại) chức năng tại thời gian chạy trong C
- 21. Thời gian theo dõi trong Java: sử dụng currentTimeMills()
- 22. Làm thế nào tôi có thể đặt dấu thời gian hiện tại trong một Sơ đồ Mongoose?
- 23. iPhone - Làm thế nào tôi có thể phát hiện thiết bị đang chạy một bản dựng adhoc của ứng dụng của tôi tại thời gian chạy
- 24. Tại sao cụm từ thông dụng có thể có thời gian chạy theo hàm mũ?
- 25. Làm thế nào tôi có thể theo dõi cửa sổ nào hiện tại có tiêu điểm bàn phím
- 26. Trong Python, làm thế nào tôi có thể biến định dạng này thành một dấu thời gian unix?
- 27. làm thế nào để tạo ra một lớp năng động tại thời gian chạy trong Java
- 28. Làm thế nào tôi có thể theo dõi Tomcat với jvisualvm, hiển thị visualgc?
- 29. Làm thế nào tôi có thể tạo động một bộ chọn khi chạy với Objective-C?
- 30. Làm cách nào tôi có thể trích xuất tài nguyên vào tệp trong thời gian chạy?
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. –
@ 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
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