2012-01-14 43 views
5

我在調試php。當我查看內存中一個我知道指向地址的地方時,我看到了指針 - 例如22810408(0x08048122) - 這是使用CLI的CLI版本。然而,當我使用apache2並嘗試做同樣的事情時,我沒有看到指向真實地址的指針。相反,我看到ELF標題的偏移量,當它添加到ELF標題的地址時,會給我「真實」地址。 例如,如果「真實」地址是0x08048122,並且ELF標頭是0x08048000,那麼我會在同一位置看到22010000(0x122)。爲什麼apache將偏移量保存到php-cli擁有虛擬內存地址的內存中?

當我試圖找出堆棧中某個東西的「真實」地址時,就會出現問題。 「真實」的地址應該是0xbfccxxxx,但是當我把這個數字加到ELF頭部時,事情就不會加起來!我得到了所有錯誤的地址。

我已經試了很長時間的Google搜索,但我真的不知道如何正確地說出這個詞,或者要搜索什麼。

所以,我基本上尋找的是更多的信息爲什麼Apache有一個偏移量,而不是一個真正的內存地址,以及這是如何涉及到堆棧上的地址。任何人都可以給我任何可能澄清的材料的指針?

+0

您是否正在查看可執行文件中尚未加載的偏移量,而不是正在運行的進程中的地址? – ugoren 2012-01-14 19:50:38

+0

這可能是如何工作的。你有關於如何工作的更多信息? – optional 2012-01-14 19:59:44

+1

你的「指針」讓我有更好的搜索結果。看來,對於Apache,PHP是一個.so,不是一個真正的可執行文件。所以,我看到的是偏移量,而不是實際地址,這是原因。我仍然無法完全理解的是如何從我的「偏移」轉到真正的虛擬內存地址。我仍在閱讀,但任何澄清或強制性閱讀將不勝感激。至少現在我明白了,我不能簡單地添加我的ELF地址來獲得正確的地址 - 似乎我需要解析重定位表.. – optional 2012-01-14 20:47:31

回答

2

Apache利用mod_php,一個dynamically 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的1:1(因爲PHP的鴨子鍵入),對於關聯數組和對象,內存中的表示與C對象的表示非常不同。

我建議您使用specialized PHP debugger來調試PHP應用程序。

相關問題