Remote reflection в .NET runtime

Автор статті — Сердар Курбанов SerdarKurbanov, засновник команди і провідний розробник Telescope.


При використанні програмного забезпечення можуть зустрічатися ситуації, коли додаток неможливо або небажано зупиняти навіть при виникненні несправності. В таких ситуаціях, коли використання налагоджувача неможливо, виявлення помилки може представляти нетривіальну задачу.
Ситуація може бути ще заплутаніше, якщо додаток використовує багатопоточність. Визначити який саме потоків викликав помилку може допомогти логування, але більш універсальним рішенням була б можливість поглянути всередину працюючої програми і побачити стану об'єктів, не зупиняючи її. Одним з підходів до цієї задачі може бути використання можливостей System.Reflection.




Рішення Reflection
Розглянемо застосування Reflection для згаданої проблеми — багатопотокова програма працює некоректно, і нам потрібні деталі роботи потоків у цій програмі. Для моделювання такої ситуації створимо консольний додаток, в якому два потоку синхронизуются з допомогою System.Threading.ManualResetEventSlim. Один з потоків завершує виконання раніше другого, і нам необхідно зрозуміти, який з них запізнюється.

Тепер додамо в нашу програму клас, який буде відображати властивості об'єктів синхронізації з допомогою Reflection.



Також додамо код, що дозволяє відображати дані, отримані за допомогою Reflection у вікні браузера за запитом 127.0.0.1:20000



Запустивши програму і запросивши в браузері вказану адресу, ми побачимо властивості наших об'єктів і зрозуміємо, що перший потік завершив роботу, а другий ще немає.



Розвиток ідеї


Використовуючи цю ідею ми зробили додаток Telescope, який Ви можете завантажити з flussig.org. Це програма для віддаленого перегляду значень об'єктів .NET-додатки на зразок вікна watch Visual Studio, але дозволяє віддалено переглядати об'єкти без зупинки програми. Рішення складається з двох частин – складання TelescopeNode.dll, вбудованої в Ваш проект і одержує дані про об'єкти з допомогою Reflection, та програми Telescope.exe, що грає роль аггрегатора інформації про досліджуваних об'єктах і передає інформацію на браузер, де ви бачите список об'єктів і їх властивостей.

B тієї ж задачі про об'єкти синхронізації в багатопотоковому додатку можна прив'язатися до властивостей об'єктів з допомогою такого коду:



У результаті у вікні браузера властивості об'єктів будуть відображені в наступному вигляді:



Немного філософії
Сучасна розробка намагається використовувати як можна більш гнучкі підходи і щільні зв'язки між розробниками, тестерами, менеджерами і клієнтами – Agile і DevOps використовуються (явно або неявно) у більшості команд розробників, що створюють продукти для комерційних компаній, оскільки це дає переваги у швидкості створення продуктів і призводить до більшого задоволення кінцевих користувачів. Гнучкість визначається як роботою менеджерів, так і програмними засобами – їй сприяє правильний вибір IDE, покриття сценаріїв роботи програми юніт-тестами, безперервна інтеграція.
Створивши Telescope, ми сподіваємося додати гнучкості на рівень тестування і налагодження, давши можливість виробляти аналог налагодження вже після релізу. Telescope може використовуватися як останній рубіж оборони від помилок (особливо для внутрішніх продуктів, до яких є більш легкий доступ) – коли програма вже запущена в релізі, але вимагається контроль за станом деяких об'єктів або визначення джерела вже відбулася помилки.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.