2012-01-14 15 views
5

Estoy depurando php. Cuando miro un lugar en la memoria donde sé que hay un puntero a una dirección, veo el puntero, por ejemplo 22810408 (0x08048122), esto es cuando uso la versión CLI de php.¿Por qué apache mantiene desplazamientos en la memoria donde php-cli contiene direcciones de memoria virtual?

SIN EMBARGO, cuando estoy usando apache2 y trato de hacer lo mismo, no veo un puntero a la dirección real. En cambio, veo un desplazamiento desde el encabezado ELF que cuando se agrega a la dirección del encabezado ELF, me da la dirección "real". Por ejemplo, si la dirección "real" era 0x08048122, y el encabezado ELF estaba en 0x08048000, entonces vería 22010000 (0x122) en esta misma posición.

El problema surge cuando trato de averiguar la dirección "real" de algo que está en la pila. La dirección "real" se supone que es 0xbfccxxxx, pero cuando agrego el número que encuentro en el encabezado ELF, las cosas simplemente no se suman. Recibo todas las direcciones incorrectas.

Ya he intentado googlear durante mucho tiempo, pero realmente no estoy seguro de cómo decir esto correctamente, o qué buscar.

Entonces, lo que básicamente busco es más información sobre POR QUÉ Apache tiene una compensación en lugar de una dirección de memoria real, y cómo todo esto se relaciona con las direcciones en la pila. ¿Alguien podría darme algún consejo sobre el material que podría aclarar?

+0

¿Podría estar mirando las compensaciones en un archivo ejecutable, que aún no está cargado, en lugar de direcciones en un proceso en ejecución? – ugoren

+0

Así es como funciona. ¿Tiene más información sobre cómo funciona esto? – optional

+1

Su "puntero" me dio mejores resultados en Google. Parece que para apache, php es .so, no es un archivo ejecutable real. Entonces, lo que veo son compensaciones, no direcciones reales, y esta es la causa. Lo que aún no entiendo completamente es cómo pasar de mi "desplazamiento" a la dirección de memoria virtual real. Todavía estoy leyendo, pero cualquier aclaración o lectura obligatoria sería muy apreciada. Al menos ahora entiendo que no puedo simplemente agregar mi dirección ELF para obtener la correcta - parece que necesito analizar la tabla de reubicación ... – optional

Respuesta

2

Apache utiliza mod_php, a dynamically linked shared object library (.so). Ver what is mod_php?. Mientras que PHP-CLI es un front-end para la API Zend (ejecutable php).

mod_php en sus cargas laterales y utiliza la API zend para analizar y devolver archivos PHP a apache. Como puede ver, hay una gran cantidad de indirección aquí. Este método funciona mejor y más rápido que dejar que apache use PHP como daemon o similar.

Al depurar PHP normalmente trabajas en un nivel mucho más alto que esto, porque incluso si obtienes los desplazamientos correctos; Los tipos de datos PHP no son 1: 1 los de C (debido a la tipificación de pato de PHP) y para las matrices y los objetos asociativos la representación en la memoria es muy diferente a la de un objeto C.

Le recomendaría que use un specialized PHP debugger para depurar aplicaciones PHP.

Cuestiones relacionadas