2012-02-02 15 views
5

Chcę, jak mówi tytuł, wydrukować zawartość stosu w moim programie C.Jak mogę wydrukować zawartość stosu w programie C?

Oto kroki zrobiłem:

  • Zrobiłem plik prosty montaż (helper.s), który obejmował funkcję powrotu adres mojego ebp rejestru oraz funkcję powrotu Adres mojego esp zarejestrować

    .globl get_esp 
    
    get_esp: 
        movl %esp, %eax 
        ret 
    # get_ebp is defined similarly, and included in the .globl section 
    
  • Zadzwoniłem get_esp() i get_ebp() funkcji z moim programie C (fpC = get_esp(); gdzie FPC jest int)
  • i (z powodzeniem, jak sądzę) print ed adres moich rejestrów esp i ebp (fprintf (stderr, "%x", fcP);)
  • Próbowałem i nie udało mi się wydrukować zawartości mojego rejestru esp. (Próbowałem między innymi fprintf (sderr, "%d", *fcP); i fprintf (sderr, "%x", *((int *)fcP));). Mój program generuje błąd segmentacji w środowisku wykonawczym podczas przetwarzania tego wiersza.

Co robię źle?

EDYCJA: Należy to wykonać, wywołując te funkcje zespołu, aby uzyskać wskaźniki stosu. EDIT2: Jest to zadanie domowe.

+0

Co masz na myśli mówiąc, że się nie powiodło? Jakie wyniki uzyskałeś i czego oczekiwałeś? –

+0

Aby wydrukować wskaźniki, musisz użyć 'printf ("% p ", (void *) (p))'. "Zawartość% esp" jest wskaźnikiem. –

+0

@CarlNorum: Nie, użycie 'printf' jest po prostu wymagane przez standard C. (Por. "Argumenty variadyczne".) –

Odpowiedz

5

Jeśli korzystasz z systemu GNU, możesz mieć możliwość używania rozszerzenia GNU do biblioteki C do obsługi śledzenia wstecznego, zobacz here.

#include <execinfo.h> 

int main(void) 
{ 
    //call-a-lot-of-functions 
} 

void someReallyDeepFunction(void) 
{ 
    int count; 
    void *stack[50]; // can hold 50, adjust appropriately 
    char **symbols; 

    count = backtrace(stack, 50); 
    symbols = backtrace_symbols(stack, count); 

    for (int i = 0; i < count; i++) 
     puts(symbols[i]); 

    free(symbols); 
} 
+0

To wygląda na dobry sposób, ale muszę to zaimplementować za pomocą funkcji składania (zgodnie z wymaganiami zadania). Powinienem był to określić w moim problemie. – Nate

+0

Ważne jest, aby oznaczyć pytania domowe jako zadanie domowe. – dreamlax

+0

Przepraszam za to. Zmieniono oryginalny wpis. – Nate

4

get_esp powraca esp jak to jest w tej funkcji. Ale to nie jest to samo, co esp w funkcji wywołującej, ponieważ operacja wywołania zmienia się na esp.

Zalecam zastąpienie funkcji podzespołem złożonym w linii. W ten sposób esp nie zmieni się podczas próby odczytu.

Również drukowanie pod numerem sderr nie pomoże. Z mojego doświadczenia wynika, że ​​stderr działa znacznie lepiej.

Powiązane problemy