Как избавиться от неуправляемого кода в VW 3.1d и ENVY

У меня есть старый образ VW3/ENVY с посылкой, загруженной как неуправляемый код (именно такая ситуация Mastering ENVY/DEVELOPER предупреждает об этом). К сожалению, эта проблема случилась давно и уже поздно просто "вернуться" к изображению без загруженной посылки.

Судя по всему, есть способ решить эту проблему (у нас есть один образ разработки, где это решено, и есть обычные карты конфигурации, которые содержат точно такой же код, что и неуправляемая посылка, но не могут быть загружены), но точный способ уже давно забыт (и есть некоторые проблемы с использованием этого конкретного образа разработчика в качестве основы для нового образа среды выполнения, поэтому мне нужно выяснить, как это сделать снова).

Теоретически должна быть возможность удалить посылку и перезагрузить код с карты конфигурации. На практике все обычные способы (использование ParcelBrowser или прямой вызов UnmanagedCode>>remove) не работают. Я даже пытался вручную удалить неверные селекторы из словаря методов, но после определенного момента (включая вызов #primBecome:) все изображение полностью зависало (я даже не могу зайти в отладчик). Я начал взламывать экземпляры классов и методов, надеясь обмануть ENVY, заставив их думать, что эти конкретные методы являются обычным версионным кодом, но пока безуспешно.

Есть ли вокруг какие-нибудь гуру болтовни/зависти, которые все еще помнят достаточно VW 3, чтобы дать мне какие-либо указатели?

Обновление статуса После недели попыток решить проблему я, наконец, сделал это, по крайней мере, частично, так что, если кому-то интересно...

Во-первых, мне пришлось исправить файловые указатели для неуправляемого кода (иначе все, что пыталось прикоснуться к методам, выбрасывало исключение). Похоже, что ENVY расширяет Parcel, так что теоретически все целочисленные файловые указатели заменяются на файловый указатель ENVY void при загрузке, но в моем случае мне пришлось делать это вручную (Parcel обеспечивает перечисление для всех селекторов, которые он определяет). Другой способ — настроить код filePointer, но это нельзя легко сделать автоматически для каждого изображения, где это необходимо.

Затем посылка может быть отброшена, при этом информация о посылке удаляется, но сохраняется код. Официальный механизм «Отменить» должен иметь действительный файл изменений (который envy не использует, поэтому его нужно установить вручную, а затем сбросить) и источник посылки (который, к счастью, у нас был).

Чтобы иметь возможность вносить какие-либо изменения в методы (либо вручную, либо путем загрузки приложения или класса из ENVY), им необходимо избавиться от своего неуправляемого статуса. Это можно сделать, настроив вручную TheClass>>applicationAssocs (я также избавился от всех ссылок на классы в UnmanagedCode как временные метки и удалил ссылку на отброшенную посылку). На самом деле у меня была некоторая информация о том, как добраться до этой точки от моего босса, но я не мог понять инструкции, пока почти не понял это сам.

Это, наконец, позволило мне загружать и перезагружать все приложения, содержащие классы. В теории. На практике изображение по-прежнему полностью зависало всякий раз, когда я пытался загрузить более новую версию приложения (которая содержала код, ранее находившийся в посылке).

Оказалось, что сбои были связаны абсолютно не с неуправляемостью кода, а с тем, что рассматриваемая посылка модифицировала InputState>>process:, где вызвала исключение из-за отсутствующего и/или неинициализированного класса переменная (метод InputState>>initialize не вызывался до тех пор, пока не появился новый метод process:). Мне пришлось модифицировать класс Notifier, чтобы сбрасывать все исключения в файл, чтобы узнать, что происходит. Добавление переменной класса в источник класса (вместо добавления ее через отражение), приостановка потока обработки ввода через toBeLoadedCode и его повторный запуск в методе loaded и создание новой версии приложения решили даже эту проблему.

Теперь все работает, в теории. На практике он по-прежнему непригоден, потому что перезагрузка приложений WindowSystem или VisualworksBase приводит к запуску их блоков инициализации, и многие настройки сбрасываются до значений по умолчанию — шрифты и размеры шрифтов, цвета окон, настройки пользовательского интерфейса... похоже, есть способ просто сохранить настройки в файл и загрузить их позже, или просто посмотреть, каковы все настройки (либо официальное меню настроек не показывает все, либо у нас сильно измененное изображение ... так много для реконструкции с нуля). Но это совсем другой вопрос.


person Kim Sullivan    schedule 07.09.2009    source источник
comment
+1 вау, давно не видел вопросов с тегами smalltalk.   -  person karim79    schedule 07.09.2009


Ответы (1)


Ну, обычно рекомендуется, чтобы вы могли перестроить свой образ разработки с нуля, загрузив свой код из репозитория. Но если бы у вас было это, то ответ был бы простым, просто выбросьте это изображение и перезагрузите. Я думаю, что прошло уже достаточно много времени, чтобы я потерял все знания, которые у меня были о том, как возиться с внутренними структурами, чтобы вернуть их, и похоже, что вы пробовали много вещей. Таким образом, хотя это может быть болезненно, выяснение рецепта восстановления вашего образа разработки путем загрузки материалов из репозитория звучит так, как будто это может быть вашим лучшим выбором. Вероятно, это не так уж и ужасно, просто может быть несколько зависимостей от состояния изображения или специальные действия, которые необходимо выполнить.

Вам также, вероятно, потребуется сверить содержимое репозитория с изображением, с которым вы работаете. Если бы был загружен неуправляемый код, а затем кто-то его модифицировал и сохранил, мне непонятно, был бы он сохранен в ENVY. Таким образом, вы, вероятно, захотите проверить весь неуправляемый код и, если он был изменен, сохранить его в выпуске репозитория.

Извините, у меня нет лучших ответов.

person Community    schedule 10.09.2009
comment
Вау, спасибо за ответ! Я смог добиться некоторого прогресса, и оказалось, что настоящий неуправляемый код был наименьшей из моих проблем. Я обновлю свой первоначальный вопрос своими выводами. - person Kim Sullivan; 12.09.2009