Автор Тема: Горячая замена кода  (Прочитано 23525 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Горячая замена кода
« Ответ #16 : Декабрь 04, 2013, 04:51:53 pm »
Цитата: vlad
Проблема в том насколько хорошо это работает при ежедневной разработке, когда нет цели делать горячую замену (и думать о ней), а есть цель пилить код. Потому что ББ подразумевает при разработке постоянную загрузку/выгрузку просто потому, что он так работает, а не потому что это требуется в конечном приложении.

Цитата: ilovb
Если мы вдруг желаем заменять реализацию в процессе разработки (перекомпилируем и выгружаем модули), то достаточно в секции CLOSE добавить вызов метода SetDir(StdDir).

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #17 : Декабрь 04, 2013, 04:56:22 pm »
Какие еще уязвимости? O_o

Грубо говоря - в 99.9% случаев ты получишь трап. Потому что адрес находится вне адресного пространства процесса или мусор лежащий по этому адресу будет квалифицирован как invalid processor instruction. А в оставшемся 0.1% ты получишь "странное" поведение. А если хакеры постараются - то и security hole.

Для сравнения - в случае NIL указателя ты в 100% получишь трап.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #18 : Декабрь 04, 2013, 04:59:34 pm »
Какие еще уязвимости? O_o

Грубо говоря - в 99.9% случаев ты получишь трап. Потому что адрес находится вне адресного пространства процесса или мусор лежащий по этому адресу будет квалифицирован как invalid processor instruction. А в оставшемся 0.1% ты получишь "странное" поведение. А если хакеры постараются - то и security hole.

Для сравнения - в случае NIL указателя ты в 100% получишь трап.
Эмм.. Совсем не факт что эта дыра в ББ есть. Нужно смотреть в детали реализации.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Горячая замена кода
« Ответ #19 : Декабрь 04, 2013, 05:00:15 pm »
vlad: Ты думаешь что в ББ это именно так работает? :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #20 : Декабрь 04, 2013, 05:02:56 pm »
Цитата: ilovb
Если мы вдруг желаем заменять реализацию в процессе разработки (перекомпилируем и выгружаем модули), то достаточно в секции CLOSE добавить вызов метода SetDir(StdDir).

Еще раз. Я не желаю ничего там заменять. Я желаю разрабатывать свою программу, которой нафиг не сдалась динамическая я загрузка, потому что она грузится один раз и летит на Марс. Но ББ заставляет меня выгружать/загружать модули как часть процесса разработки. Пример показывает, что при этом могут возникать проблемы.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Горячая замена кода
« Ответ #21 : Декабрь 04, 2013, 05:06:40 pm »
Цитата: vlad
Я не желаю ничего там заменять
Так с этого и надо было начинать.

"Но ББ заставляет "
Заставляет? Вот ведь скотина! Лучше б "разрешил" завершить прогу, пересобрать и снова запустить.

А что собсна мешает работать в православном стиле с++? O_o
« Последнее редактирование: Декабрь 04, 2013, 05:09:30 pm от ilovb »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #22 : Декабрь 04, 2013, 05:07:21 pm »
vlad: Ты думаешь что в ББ это именно так работает? :)

Если бы это работало по другому, то трап был бы более информативным.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #23 : Декабрь 04, 2013, 05:08:06 pm »
Вообще, теоретически, в ББ МОЖНО сделать на уровне фреймворка горячую замену кода. Действительно можно. Нужно добавить "команду" Update (unload & load), которая будет выполняться атомарно (благо многозадачности в ББ нет, так что и с этим проблем нет). В процессе такого update выполняем:
1) выгрузку старой версии модуля.
2) поиск всех оставшихся объектов в памяти за которые ответственен данный модуль
3) загрузка новой версии модуля
4) передача всех найденных объектов специальной функции конвертации новой версии модуля (в том числе указателей на функции!) в качестве VAR-параметров. Пусть конвертирует да меняет.

Все четыре пункта должны идти непрерывно и атомарно (то есть message loop не крутится).
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Горячая замена кода
« Ответ #24 : Декабрь 04, 2013, 05:10:45 pm »
Пример показывает, что при этом могут возникать проблемы.

Пример не показывает абсолютно ничего кроме радиуса...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Горячая замена кода
« Ответ #25 : Декабрь 04, 2013, 05:12:48 pm »
Если бы это работало по другому, то трап был бы более информативным.

Этот трап не более и не менее информативный чем любой другой трап в ББ.
Номер ошибки есть. Дамп есть. Где сработал трап показано. Что еще надо?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #26 : Декабрь 04, 2013, 05:13:18 pm »
Цитата: vlad
Я не желаю ничего там заменять
Так с этого и надо было начинать.

Сознаюсь, я отклонился от темы, но я обозначил интересующий меня аспект еще вот здесь: http://oberspace.dyndns.org/index.php/topic,598.msg20104.html#msg20104:
Цитировать
Проблема в том насколько хорошо это работает при ежедневной разработке, когда нет цели делать горячую замену


"Но ББ заставляет "
Заставляет? Вот ведь скотина! Лучше б "разрешил" завершить прогу, пересобрать и снова запустить.

Претензий к "заставляет" не было. Он так работает - пожалуйста. Причем такой подход рекламируется и имеет определенные преимущества. А мы тут как раз степень фатальности недостатков такого подхода обсуждаем :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Горячая замена кода
« Ответ #27 : Декабрь 04, 2013, 05:16:33 pm »
2) поиск всех оставшихся объектов в памяти за которые ответственен данный модуль

Если реализация устанавливается только в экспортные переменные, то сделать контроль раз плюнуть. Kernel позволяет перебрать экспортные переменные модуля.
А вот если объекты не в глобальных переменных... то это нужно что-то вроде сборщика мусора только для модулей.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #28 : Декабрь 04, 2013, 05:18:50 pm »
Этот трап не более и не менее информативный чем любой другой трап в ББ.
Номер ошибки есть. Дамп есть. Где сработал трап показано. Что еще надо?

"Метод объекта принадлежит такому-то модулю выгруженному в такое-то время"?

P.S. Номер ошибки - это вообще прошлый век. Ценен только как дополнение к нормальной диагностике, для статистики и т.п. локализаций.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Горячая замена кода
« Ответ #29 : Декабрь 04, 2013, 05:21:56 pm »
Дамп есть. Где сработал трап показано. Что еще надо?

Кстати, место где сработало полезно только в сравнении с вообще ничем. Потому что само место будет вполне валидным - вызов метода не-NIL объекта.