2012-01-14 12 views
5

Jestem debugowania php. Kiedy patrzę na miejsce w pamięci, w którym znam wskaźnik na adres, widzę wskaźnik - na przykład 22810408 (0x08048122) - to jest przy użyciu wersji php w CLI.Dlaczego apache przechowuje przesunięcia w pamięci, gdzie php-cli przechowuje adresy pamięci wirtualnej?

JEDNAK, kiedy używam apache2 i próbuję zrobić to samo, nie widzę wskaźnika do prawdziwego adresu. Zamiast tego widzę odsunięcie od nagłówka ELF, który po dodaniu do adresu nagłówka ELF daje mi "prawdziwy" adres. Na przykład, jeśli "prawdziwy" adres był 0x08048122, a nagłówek ELF był na 0x08048000, wtedy zobaczyłbym 22010000 (0x122) w tej samej pozycji.

Problem pojawia się, gdy próbuję znaleźć "prawdziwy" adres czegoś, co znajduje się na stosie. "Prawdziwy" adres ma być 0xbfccxxxx, ale kiedy dodaję numer znajdujący się w nagłówku ELF, rzeczy po prostu się nie sumują! Dostaję wszystkie złe adresy.

Próbowałem już googlować przez długi czas, ale nie jestem pewien, jak to poprawnie sformułować lub czego szukać.

Tak więc, czego zasadniczo szukam, to więcej informacji o tym, dlaczego Apache ma przesunięcie zamiast prawdziwego adresu pamięci i jak to wszystko odnosi się do adresów na stosie. Czy ktokolwiek mógłby mi podać jakieś wskazówki do materiału, który mógłby wyjaśnić?

+0

Czy możesz przyglądać się przesunięciom w pliku wykonywalnym, który nie jest jeszcze wczytywany, a nie na adresach w uruchomionym procesie? – ugoren

+0

To pewnie tak działa. Czy masz więcej informacji o tym, jak to działa? – optional

+1

Twój "wskaźnik" dał mi lepsze wyniki wyszukiwania. Wygląda na to, że do Apache'a php jest .so, a nie prawdziwym plikiem wykonywalnym. Widzę więc przesunięcia, a nie rzeczywiste adresy, a to jest przyczyną. Czego jeszcze nie rozumiem, to jak przejść z mojego "przesunięcia" do prawdziwego adresu pamięci wirtualnej. Wciąż czytam, ale wszelkie wyjaśnienia lub obowiązkowe lektury byłyby mile widziane. Przynajmniej teraz rozumiem, że nie mogę po prostu dodać mojego adresu ELF, aby uzyskać właściwy - wydaje się, że muszę przeanalizować tabelę przeniesienia .. – optional

Odpowiedz

2

Apache wykorzystuje mod_php, a dynamically linked shared object library (.so). Zobacz what is mod_php?. Gdzie jako PHP-CLI jest front-end do interfejsu API Zend (plik wykonywalny php).

mod_php po swojej stronie ładuje i wykorzystuje API Zend do analizowania i zwracania plików PHP do apache. Jak widać, tutaj jest dużo pośrednictwa. Ta metoda działa lepiej i szybciej niż pozwalanie Apache'owi na używanie PHP jako demona lub czegoś podobnego.

Podczas debugowania PHP normalnie pracujesz na znacznie wyższym poziomie niż ten, ponieważ nawet jeśli uzyskasz odpowiednie korekty; Typy PHP nie mają wartości 1: 1 dla C (z powodu pisania kaczego PHP), a dla asocjacyjnych tablic i obiektów reprezentacja w pamięci jest bardzo odmienna niż w przypadku obiektu C.

Polecam, aby użyć debugowania aplikacji PHP przy użyciu specialized PHP debugger.

Powiązane problemy