December 25, 2008

Операции на открытом сердце

Страшно звучит, правда? Хочу поразмышлять немного на тему такого рода операций в приложении к программным продуктам.

Есть классические способы понять чем занимается приложение в конкретный момент времени: отладка и логи. Лично я предпочитаю логи, потому что они более приближены к боевым условиям. Любой дебагер, каким бы хорошим он ни был, всё равно вносит какие-то коррективы в работу приложения, а иногда отладить конкретную функциональность под дебагером вообще невозможно, вспомним хотя бы треды. Добавив немного логирующего кода, можно после тестового прогона приложения получить сколько угодно реальной информации, сообщающей в какой последовательности исполнялся тот или иной код, чему были равны переменные и так далее. Важно, что приложение исполняется как есть, без оверхеда, присущего исполнению в отладчике. К сожалению, всё не так прекрасно, потому что добавление логирующего кода - это, как ни странно звучит, изменение кода, а значит, требует пере-сборки системы. В "полевых" условиях такой финт невозможен.

Представьте ситуацию. Приходим к пользователю, он говорит "не работает". Смотрим, действительно, в определённой ситуации не работает как надо, не совсем понятно почему, но примерная область нахождения источника проблем известна. Исходного кода под рукой нет. В простейшем случае говорим "окэй, я посмотрю" и удаляемся чинить или полагаемся на авось: "а вдруг оно ему и не надо и он больше никогда этим пользоваться не будет".

А что если взять и встроить в приложение некий DSL, который позволил бы "покопаться" во внутреннем состоянии работающего приложения?! Я, как обычно, имею ввиду Microsoft .Net Framework. В качестве DSL сейчас запросто может выступать IronPython, хотя, когда DLR  увидит свет, таким DSL может стать любой .net язык программирования. Просто вставляем engine куда-нибудь внутрь приложения, по нажатию секретного shortcut'а запускаем консоль, куда передаём в качестве контекста внутреннее состояние приложения и вуа ля! у нас есть доступ к моментальному слепку состояния системы, возможность его мониторить и даже в какой-то мере менять, выполнять действия за систему, контролировать ход исполнения, добавлять необходимое логирование. Правда, нельзя эти изменения потом сохранить, ну или я просто пока не придумал как это можно было бы сделать :-)

Идея, конечно, не нова. На просторах интернета можно найти кучу статей и постов на тему "как добавить поддержку скриптов ХХХ  в приложение, написанное на YYY", но лично я не разу не встречал ни в теории ни на практике возможности доступа к внутренностям приложения на лету.

Any ideas?

This page is powered by Blogger. Isn't yours?