Почему apache удерживает смещения в памяти, где php-cli содержит адреса виртуальной памяти? - PullRequest
5 голосов
/ 14 января 2012

Я отлаживаю php.Когда я смотрю на место в памяти, где я знаю, что указатель на адрес находится, я вижу указатель - например, 22810408 (0x08048122) - это при использовании CLI-версии php.

ОДНАКО, когда я 'Я использую apache2 и пытаюсь сделать то же самое, но не вижу указателя на реальный адрес.Вместо этого я вижу смещение от заголовка ELF, которое при добавлении к адресу заголовка ELF дает мне «реальный» адрес.Например, если «реальный» адрес был 0x08048122, а заголовок ELF был 0x08048000, то я бы увидел 22010000 (0x122) в этой же позиции.

Проблема возникает, когда я пытаюсь выяснить «реальный»"адрес чего-то, что находится в стеке.Предполагается, что «реальный» адрес равен 0xbfccxxxx, но при добавлении числа, которое я нахожу в заголовок ELF, все просто не складывается!Я получаю все неправильные адреса.

Я уже давно пробовал гуглить, но я действительно не уверен, как правильно это сказать или что искать.

Итак,По сути, мне нужно больше информации о том, ПОЧЕМУ Apache имеет смещение вместо реального адреса памяти, и как все это относится к адресам в стеке.Может ли кто-нибудь дать мне какие-либо указания на материал, который мог бы прояснить?

1 Ответ

2 голосов
/ 30 января 2012

Apache использует mod_php, динамически связанную библиотеку общих объектов (.so).Смотрите что такое mod_php? .Где, поскольку PHP-CLI является интерфейсом к Zend API (исполняемый файл php).

mod_php со своей стороны загружает и использует Zend API для анализа и возврата файлов PHP в apache.Как вы можете видеть, здесь много косвенности.Этот метод работает лучше и быстрее, чем позволить Apache использовать PHP в качестве демона или чего-либо подобного.

При отладке PHP вы обычно работаете на гораздо более высоком уровне, чем этот, потому что даже если вы получаете корректные смещения;Типы данных PHP не являются типами данных 1: 1 для C (из-за типизации PHP в утке), а для ассоциативных массивов и объектов представление в памяти очень отличается от представления объекта C.

Я бы порекомендовал вам использовать специализированный PHP-отладчик для отладки PHP-приложений.

...