2015-03-10 11 views
6

Mam coredump procesu, który się rozbił (trudno reprodukować).Analiza zmiennych lokalnych zwróconych funkcji

Wyliczyłem, że coś poszło nie tak w funkcji , która właśnie zwróciła (zwróciła wskaźnik NULL zamiast wskaźnika nie-NULL).

Byłoby mi bardzo pomocne dla mnie znać zawartość zmiennych stos w tej funkcji. Myślę, że na większości architektur, powrót z funkcji oznacza po prostu zmianę wskaźnika stosu. Innymi słowy, te wartości nadal istnieją (poniżej wskaźnika stosu, jeśli weźmiemy x86 jako przykład).

Czy ktoś może potwierdzić moje uzasadnienie jest poprawne i może podać przykład jak to zrobić z gdb?

Czy moje rozumowanie dotyczy również MIPS?

+1

W gbd spróbuj 'help x'. – alk

Odpowiedz

4

Zmienne lokalne mogły być przechowywane na stosie, ale niekoniecznie. Jeśli istnieje tylko niewielka liczba zmiennych, które pasują do rejestrów, a kod jest zoptymalizowany, zmienne lokalne nigdy nie zostały zapisane na stosie. W zależności od używanej konwencji wywoływania wartości ostateczne zmiennych lokalnych mogą nadal występować w rejestrach.

Zdemontuj daną funkcję (w tym celu możesz użyć programu objdump -dS, aby móc łatwo skorelować źródło). Zobacz, jak uzyskiwano dostęp do zmiennych lokalnych. Czy były przechowywane w pamięci lub w rejestrach? Czy rejestry zostały już przywrócone do wartości odpowiedniej dla dzwoniącego?

Jeśli oryginalna wartość rejestru nie została przywrócona, wystarczy sprawdzić rejestr, który był używany do przechowywania lokalnego. Jeśli został już przywrócony, prawdopodobnie został utracony.

Jeśli wartości lokalne były przechowywane w stosie, funkcja prolog (pierwsze instrukcje) powinna informować o manipulacji stosem i wskaźnikiem ramki. Biorąc pod uwagę, że połączenie zapisywane jest również na stosie (zapisane na PC), można obliczyć wartość wskaźnika stosu/ramki używanego w tej funkcji. Następnie użyj x do sprawdzenia lokalizacji pamięci.

W zależności od funkcji wywoływanej, można również sprawdzić jej argumenty (po wywołaniu) i ponownie obliczyć wartość zmiennych lokalnych.

0

można zobaczyć zmiennej lokalnej, która nie zostać zoptymalizowana za pomocą:

info locals 

Nie może pracować w funkcji, która już wrócić, choć. Jeśli możesz ponownie uruchomić ten program, spróbuj umieścić punkt przerwania tuż przed powrotem funkcji.

W przeciwnym razie można ręcznie zbadać stos, używając x/x i info register, aby poznać adres wskaźnika stosu.

Możesz wtedy przeglądać stos używając up i down.

+0

Jeśli funkcja została już zakończona, lokalni nie są już na stosie. – urzeit

+0

Och, powrócił. Nie zauważyłem tego. – blue112