1

アンマネージ コードとしてロードされたパーセルを含む古い VW3/ENVY イメージがあります (マスタリング ENVY/DEVELOPERが警告する状況とまったく同じです)。残念ながら、この問題はかなり前に発生しており、小包が読み込まれていない画像に「戻る」だけでは遅すぎます。

どうやら、この問題を解決する方法があります (これが解決された 1 つの開発イメージがあり、管理されていない区画とまったく同じコードを含む通常の構成マップがありますが、それらはロードできません)。その方法は長い間忘れられていました (そして、その特定の開発イメージを新しいランタイム イメージのベースとして使用することにはいくつかの問題があるため、もう一度行う方法を見つける必要があります)。

理論的には、パーセルを削除して構成マップからコードをリロードできるはずです。実際には、通常の方法 (ParcelBrowser を使用するか、UnmanagedCode>>remove を直接呼び出す) はすべて失敗します。問題のあるセレクターをメソッド ディクショナリから手動で削除しようとしましたが、特定のポイント (#primBecome: の呼び出しを含む) を過ぎると、イメージ全体が完全にハングします (デバッガーにドロップすることさえできません)。クラスとメソッドのインスタンスのハッキングを開始しました。ENVY をだまして、これらの特定のメソッドが通常のバージョン管理されたコードであると認識させようとしたのですが、まだ成功していません。

ポインタを提供するのに十分なVW 3をまだ覚えている、スモールトーク/羨望の達人が周りにいますか?

ステータスの更新 問題を解決しようとして 1 週間が経過した後、少なくとも部分的には解決できました。

まず、umnanaged コードのファイル ポインターを修正する必要がありました (そうしないと、メソッドにアクセスしようとしたすべてのものが例外をスローしてしまいます)。ENVY はパーセルを拡張しているように見えるので、理論的には、voidロード時にすべての整数ファイル ポインターが ENVY のファイル ポインターに変更されますが、私の場合は手動で行う必要がありました (パーセルは、定義するすべてのセレクターの列挙を提供します)。コードを微調整する別の方法もありfilePointerますが、必要なすべての画像で自動的に行うのは簡単ではありません。

その後、小包を破棄できます。これにより、小包の情報は削除されますが、コードは保持されます。公式の「破棄」メカニズムには、有効な変更ファイル (envy は使用しないため、手動で設定し、後でリセットする必要があります) とパーセル ソース (幸運にもそれがありました) が必要です。

メソッドを (手動で、または ENVY からアプリケーションまたはクラスをロードすることによって) 変更できるようにするには、管理されていない状態を取り除く必要があります。これは、手動で微調整することで実行できますTheClass>>applicationAssocs(タイムスタンプなどの UnmanagedCode のクラスへのすべての参照も削除し、破棄された区画への参照も削除しました)。実は上司からここまでの行き方を教えてもらったのですが、自分でほぼ理解するまで指示を理解できませんでした。

これにより、クラスを含むすべてのアプリケーションをロードして再ロードできるようになりました。理論的には。実際には、アプリケーションの新しいバージョン (以前は区画に含まれていたコード) をロードしようとすると、イメージは完全にハングアップしました。

クラッシュはコードが管理されていないこととはまったく関係がないことが判明しましたが、問題の区画が変更されたという事実があり、InputState>>process:クラス変数の欠落および/または初期化されていないために例外が発生しました (InputState>>initializeメソッドが呼び出されませんでした新しいprocess:方法が導入されるまで)。Notifier何が起こっているのかを調べるために、すべての例外をファイルにダンプするようにクラスを変更する必要がありました。クラス変数をクラスのソースに追加し (リフレクション経由で追加するのではなく)、入力処理スレッドを一時停止toBeLoadedCodeしてメソッドで再起動しloaded、新しいバージョンのアプリケーションを作成することで、この問題も解決しました。

これで、理論的にはすべてが機能します。WindowSystem または VisualworksBase アプリケーションをリロードすると初期化ブロックが実行され、フォントとフォント サイズ、ウィンドウの色、UI 設定など、多くの設定がデフォルトにリセットされるため、実際にはまだ使用できません。設定をファイルに保存して後で読み込むか、すべての設定を確認するだけの方法のようです (公式の [設定] メニューにすべてが表示されないか、大幅に調整された画像があります...ゼロから再構築するのはこれで十分です)。しかし、それはまったく別の質問です。

4

1 に答える 1

1

通常、レポジトリからコードをロードして、開発イメージを最初から再構築できるようにすることをお勧めします。しかし、それがあれば、答えは簡単です。その画像を破棄してリロードするだけです。内部構造をいじって元に戻す方法について、私が持っていた知識を失うのに十分な時間が経過したと思います。あなたは多くのことを試みたようですね。ですから、面倒かもしれませんが、リポジトリから何かをロードして開発イメージを再構築するためのレシピを見つけるのが最善の策のように思えます。おそらくそれほど恐ろしいことではなく、イメージの状態にいくつかの依存関係があるか、実行する必要がある特別な doit があるだけかもしれません。

また、おそらく、作業元のイメージの内容に対してリポジトリの内容を検証する必要があります。アンマネージ コードが読み込まれ、誰かがそれを変更して保存した場合、それが ENVY に保存されていたかどうかはわかりません。そのため、アンマネージ コードをすべて監査し、変更されている場合は、それをリポジトリ エディションに保存することをお勧めします。

申し訳ありませんが、これ以上の答えはありません。

于 2009-09-10T19:32:08.320 に答える