2012-01-14 14 views
5

मैं php डीबग कर रहा हूँ। स्मृति में एक जगह को देखते समय जहां मुझे पता करने के लिए सूचक पता है, मैं सूचक को देखता हूं - उदाहरण के लिए 22810408 (0x08048122) - यह php के CLI संस्करण का उपयोग करते समय होता है।अपाचे को मेमोरी में ऑफ़सेट क्यों रखता है जहां php-cli वर्चुअल मेमोरी पतों रखता है?

हालांकि, जब मैं apache2 का उपयोग कर रहा हूं और एक ही काम करने का प्रयास कर रहा हूं, तो मुझे वास्तविक पते पर सूचक नहीं दिखाई देता है। इसके बजाय, मुझे ईएलएफ हेडर से ऑफसेट दिखाई देता है जो ईएलएफ हेडर के पते पर जोड़े जाने पर मुझे "वास्तविक" पता देता है। उदाहरण के लिए, यदि "असली" पता 0x08048122 था, और ईएलएफ शीर्षलेख 0x08048000 पर था तो मुझे इसी स्थिति में 22010000 (0x122) दिखाई देगा।

समस्या उत्पन्न होती है जब मैं स्टैक पर मौजूद किसी चीज़ के "असली" पते को जानने का प्रयास करता हूं। "वास्तविक" पता 0xbfccxxxx होना चाहिए, लेकिन जब मैं ईएलएफ शीर्षलेख में नंबर जोड़ता हूं, तो चीजें बस जोड़ती नहीं हैं! मुझे सभी गलत पते मिलते हैं।

मैंने पहले से ही लंबे समय तक googling की कोशिश की है, लेकिन मुझे सच में यकीन नहीं है कि यह कैसे सही तरीके से शब्द, या क्या खोजना है।

तो, जो मैं अनिवार्य रूप से देख रहा हूं, उस पर अधिक जानकारी है कि क्यों अपाचे के वास्तविक स्मृति पते की बजाय ऑफसेट है, और यह सब ढेर पर पते से कैसे संबंधित है। क्या कोई मुझे सामग्री के लिए कोई संकेत दे सकता है जो स्पष्ट हो सकता है?

+0

क्या आप एक निष्पादन योग्य फ़ाइल में ऑफ़सेट देख रहे हैं, जो अभी तक लोड नहीं हो रहा है, बजाय चल रहे प्रक्रिया में पते के बजाय? – ugoren

+0

शायद यह कैसे काम करता है। क्या आपके पास यह काम करने के बारे में कोई और जानकारी है? – optional

+1

आपका "पॉइंटर" मुझे कुछ बेहतर परिणाम गुगल रहा है। ऐसा लगता है कि अपाचे के लिए, php एक .so है, असली निष्पादन योग्य फ़ाइल नहीं है। तो, जो मैं देखता हूं वह ऑफसेट है, वास्तविक पते नहीं, और यही कारण है। मैं अभी भी पूरी तरह से समझ नहीं पा रहा हूं कि मेरे "ऑफ़सेट" से वास्तविक वर्चुअल मेमोरी एड्रेस में कैसे जाना है। मैं अभी भी पढ़ रहा हूं, लेकिन कोई स्पष्टीकरण या अनिवार्य पढ़ने की सराहना की जाएगी। कम से कम अब मैं समझता हूं कि मैं सही पाने के लिए अपना ईएलएफ पता नहीं जोड़ सकता - ऐसा लगता है कि मुझे स्थानांतरण तालिका को पार्स करने की आवश्यकता है .. – optional

उत्तर

2

अपाचे mod_php, dynamically linked shared object library (.so) का उपयोग करता है। what is mod_php? देखें। जहां PHP-CLI ज़ेंड एपीआई (php निष्पादन योग्य) का फ्रंट-एंड है।

mod_php इसके 'साइड लोड पर और जेड एपीआई का उपयोग पार्स फ़ाइलों को अपाचे में वापस करने और वापस करने के लिए करता है। जैसा कि आप देख सकते हैं कि यहां बहुत सारे संकेत हैं। यह विधि अपाचे का उपयोग डेमॉन या इसी तरह के रूप में PHP को देने से बेहतर और तेज़ काम करती है।

PHP को डीबग करते समय आप सामान्य रूप से इस से अधिक उच्च स्तर पर काम करते हैं, क्योंकि अगर आपको ऑफ़सेट सही मिलती है; PHP डेटाटाइप सी के 1: 1 नहीं हैं (PHP के बतख टाइपिंग के कारण) और सहयोगी सरणी और वस्तुओं के लिए स्मृति में प्रतिनिधित्व सी ऑब्जेक्ट की तुलना में बहुत अलग है।

मैं आपको PHP अनुप्रयोगों को डीबग करने के लिए specialized PHP debugger का उपयोग करने की सलाह दूंगा।

संबंधित मुद्दे