2012-01-14 27 views
5

Tôi đang gỡ lỗi php. Khi nhìn vào một nơi trong bộ nhớ mà tôi biết một con trỏ đến một địa chỉ, tôi thấy con trỏ - ví dụ 22810408 (0x08048122) - đây là khi sử dụng phiên bản CLI của php.Tại sao apache giữ offsets vào bộ nhớ nơi php-cli giữ địa chỉ bộ nhớ ảo?

BAO GIỜ, khi tôi đang sử dụng apache2 và cố gắng làm điều tương tự, tôi không thấy con trỏ đến địa chỉ thực. Thay vào đó, tôi thấy một sự bù đắp từ tiêu đề ELF khi được thêm vào địa chỉ của tiêu đề ELF, cho tôi địa chỉ "thực". Ví dụ: nếu địa chỉ "thực" là 0x08048122 và tiêu đề ELF là 0x08048000 thì tôi sẽ thấy 22010000 (0x122) ở cùng vị trí này.

Sự cố phát sinh khi tôi cố gắng tìm ra địa chỉ "thực" của thứ gì đó nằm trên ngăn xếp. Địa chỉ "thực" được cho là 0xbfccxxxx, nhưng khi thêm số tôi tìm thấy vào tiêu đề ELF, mọi thứ không thêm lên! Tôi nhận được tất cả các địa chỉ sai.

Tôi đã thử googling trong một thời gian dài, nhưng tôi thực sự không chắc chắn làm thế nào để từ này một cách chính xác, hoặc những gì để tìm kiếm.

Vì vậy, những gì tôi chủ yếu tìm kiếm là nhiều thông tin hơn TẠI SAO Apache có bù đắp thay vì địa chỉ bộ nhớ thực và cách tất cả điều này liên quan đến địa chỉ trên ngăn xếp. Bất cứ ai có thể cho tôi bất kỳ con trỏ đến tài liệu mà có thể làm rõ?

+0

Bạn có thể xem các khoảng trống trong tệp thi hành chưa được tải, thay vì tại địa chỉ trong quá trình đang chạy không? – ugoren

+0

Đó có thể là cách hoạt động của nó. Bạn có thêm thông tin về cách thức hoạt động của nó không? – optional

+1

"Con trỏ" của bạn đã cho tôi một số kết quả tốt hơn googling. Có vẻ như để apache, php là một .so, không phải là một tập tin thực thi thực sự. Vì vậy, những gì tôi thấy là offsets, không phải địa chỉ thực, và đây là nguyên nhân. Những gì tôi vẫn không hiểu hoàn toàn là làm thế nào để đi từ "bù đắp" của tôi đến địa chỉ bộ nhớ ảo thực. Tôi vẫn đang đọc, nhưng bất kỳ việc làm rõ hay bắt buộc nào sẽ được đánh giá cao. Ít nhất bây giờ tôi hiểu rằng tôi không thể chỉ cần thêm địa chỉ ELF của tôi để có được một quyền - có vẻ như tôi cần phải phân tích bảng di dời .. – optional

Trả lời

2

Apache sử dụng mod_php, một số dynamically linked shared object library (.so). Xem what is mod_php?. Trường hợp như PHP-CLI là một front-end cho API zend (php thực thi).

mod_php trên các tải phụ của nó và sử dụng API zend để phân tích cú pháp và trả về tệp PHP thành apache. Như bạn có thể thấy có rất nhiều sự vô cảm ở đây. Phương thức này hoạt động tốt hơn và nhanh hơn cho phép apache sử dụng PHP như một daemon hoặc tương tự.

Khi gỡ lỗi PHP, bạn thường làm việc ở mức cao hơn nhiều so với điều này, bởi vì ngay cả khi bạn nhận được quyền offsets; Các kiểu dữ liệu PHP không phải là 1: 1 của C (vì cách gõ vịt của PHP) và cho các mảng kết hợp và các đối tượng biểu diễn trong bộ nhớ rất khác với đối tượng C.

Tôi khuyên bạn nên sử dụng specialized PHP debugger để gỡ lỗi các ứng dụng PHP.

Các vấn đề liên quan