Delphi 2007 で madExcept + UPX を使用すると問題が発生します。圧縮されたアプリケーションを開くたびに、Windows の例外ダイアログにコード 0xc0000005 が表示されます。誰もがこれに対する解決策を持っていますか?
ありがとう!
例外などのスタック トレースでは、関数またはソース ファイルと行を示す .map ファイルまたはデバッグ情報と関連付けられるように、メモリ内コード アドレスを実行可能ファイルに格納されている仮想アドレスにマッピングする必要があります。通常、マッピングは単純で比較的直線的です。
実行可能な圧縮は、特に PE 仕様に沿ったものではない、直接的なマッピングがないため、これを台無しにします。これは、実行可能ファイルの圧縮によって、実行可能ファイルの初期化ルーチンがディスクからメモリにデータを抽出するルーチンに置き換えられるためです (これは、圧縮された実行可能ファイルが他のインスタンスとページを共有せず、圧縮されていない実行可能ファイルよりも多くのメモリを使用することも意味します。新たに拡張された元の初期化ルーチンに転送する前に、一度にすべてのページを開きます)。
そのため、スタック トレースでのコード位置の非常に巧妙な相対アドレス ストレージがなければ、2 つの手法が連携して機能することはまずありません。
FWIW、私は個人的に実行可能なパッカーの使用をお勧めしません。
すでに MadShi 自身のフォーラムで取り上げられていました。
他にもたくさんのトピックがありますが、長い話をまとめると、MadExcept 3.* 以降は UPX で問題なく動作することが知られています。
その例外コードは通常、未処理の外部例外であることを意味します。UPX を使用しないとどうなりますか? 例外はなくなりますか?
ところで、MadExcept とは何の関係もないかもしれません。通常、この例外コードは、VCL の例外ハンドラが設定される前に例外が発生したことを示しているため、MadExcept がフックされる前に発生した可能性があります。
編集:あなたのコメントから、UPX の圧縮技術が MadExcept/Delphi の例外ハンドラ チェーンを接続する機能を妨げている可能性があるようです。ブルースが提供したリンクを確認しましたか?
upxで次のスイッチを試してください。
--compress-exports = 0