2012-01-14 7 views
5

私はPHPをデバッグしています。私が知っているメモリの場所を見ているとき、私はポインタを参照しています - 例えば22810408(0x08048122) - これはPHPのCLIバージョンを使用しているときです。なぜapacheはphp-cliが仮想メモリアドレスを保持するメモリにオフセットを保持していますか?

しかし、私がapache2を使って同じことをしようとすると、実際のアドレスへのポインタは表示されません。代わりに、私はELFヘッダーのオフセットに、ELFヘッダーのアドレスに追加されたときに私に「本当の」アドレスを与えることを見ています。 たとえば、「実際の」アドレスが0x08048122で、ELFヘッダーが0x08048000の場合、同じ位置に22010000(0x122)が表示されます。

スタックにあるものの「実際の」アドレスを把握しようとすると、問題が発生します。 "本当の"アドレスは0xbfccxxxxとされていますが、ELFヘッダに見つかった番号を追加すると、物事は加算されません!私はすべての間違ったアドレスを取得します。

私は長い間、すでにグーグルを試みてきましたが、これを正確にどのように語るのか、何を検索するのかは本当に分かりません。

私が本質的に探しているのは、Apacheが実際のメモリアドレスの代わりにオフセットを持つ理由と、これがスタック上のアドレスにどのように関係しているかに関する情報です。誰も私に明確なかもしれない材料へのポインタを教えてもらえますか?

+0

実行中のプロセスのアドレスではなく、まだロードされていない実行可能ファイルでオフセットを調べることができますか? – ugoren

+0

それはおそらくそれが動作する方法です。これがどのように機能するかについての情報はありますか? – optional

+1

あなたの "ポインタ"は私にグーグルグーグルで良い結果をもたらしました。それはapacheには、phpが実際の実行可能ファイルではなく、.soであるようです。だから、私はオフセットが実際のアドレスではなく、これが原因だと思っています。私がまだ完全に理解していないのは、「オフセット」から実際の仮想メモリアドレスに移動する方法です。私はまだ読んでいるが、明確化または義務的な読書は大いに感謝されるだろう。少なくともELFアドレスを追加して正しいものを手に入れることができないことは少なくとも理解しています。再配置テーブルを解析する必要があるようです。 – optional

答えて

2

Apacheはmod_phpdynamically linked shared object library(.so)を使用します。 what is mod_php?を参照してください。 PHP-CLIはzend APIのフロントエンド(php実行可能ファイル)です。

mod_phpが読み込まれ、zend APIを使用してPHPファイルを解析してApacheに返します。あなたが見ることができるように、ここには多くの間接指示があります。この方法は、apacheがPHPをデーモンなどとして使用するよりも優れています。

PHPをデバッグする場合、通常はオフセットを正しく取得しても、これよりはるかに高いレベルで作業します。 PHPのデータ型は、Cのもの(PHPのダックタイピングのため)と1:1ではなく、連想配列やオブジェクトの場合、メモリ内の表現はCオブジェクトの表現と大きく異なります。

specialized PHP debuggerを使用してPHPアプリケーションをデバッグすることをお勧めします。

関連する問題