FPO フレーム

前ページ スタックフレーム で紹介したスタックフレームは、 EBP フレーム とも呼ばれます。EBP では EBP をフレームポインタとして使用します。

実は EBP をフレームポインタとして使用しない方法もあります。

それが Frame Pointer Omission (FPO) と呼ばれる方法です。

この方法では、スタックポインタ (とローカル変数のストレージサイズ。これはコンパイル時にわかる) を変数アクセスの基準として使い、 EBP を使いません。使わないので、呼び出し側の EBP を保存することも、 それを戻すこともありません。すなわち、以前説明したエピローグコード、プロローグコードがありません。 FPO ではスタックポインタを操作するだけのエピローグコード、プロローグコードになります。

前述のように FPO フレームでは、EBP フレームのように EBP が保存されていませんから、 スタックの情報だけからは、スタックバックトレースを構築することができません。 PDB ファイルには、FPO の情報が保存されるので正しいシンボルがある場合には、 スタックフレームのリストがつながりますが、シンボルが無い場合そこでリストが切れてしまいます。

デバッグをする人の視点で言うと、ポイントは FPO フレームも混ざっている可能性があるので、正常な状態でもシンボル情報が無ければ、 スタックが途切れて見える場合もある ということです。 ですから、 「スタックが切れて見えるから、これはスタックコラプションである」 と判断すると間違うことになる、 ということです。

ちなみに、以前の Windows は FPO が有効な状態でビルドされていましたが、Vista では FPO は無効をデフォルトとしてビルドされています。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説