2012-02-02 2 views
5

Я хочу, как говорится в заголовке, распечатать содержимое стека в моей программе на C.Как распечатать содержимое стека в программе C?

Вот шаги, которые я взял:

  • Я сделал файл простого монтажа (helper.s), который включает функцию, чтобы вернуть адрес моего EBP регистра и функцию возвращает адрес моих особ регистр

    .globl get_esp 
    
    get_esp: 
        movl %esp, %eax 
        ret 
    # get_ebp is defined similarly, and included in the .globl section 
    
  • Я назвал get_esp() и get_ebp() функции из моей программы C (fpC = get_esp(); где FPC является Int)
  • I (успешно, я думаю) печать (fprintf (stderr, "%x", fcP);)
  • Я попробовал и не смог распечатать содержимое моего регистра esp. (Я пробовал fprintf (sderr, "%d", *fcP); и fprintf (sderr, "%x", *((int *)fcP));, среди прочих методов). Моя программа поражает ошибку сегментации во время выполнения, когда эта строка обрабатывается.

Что я делаю неправильно?

EDIT: Это должно быть выполнено путем вызова этих функций сборки, чтобы получить указатели стека. EDIT2: Это домашнее задание.

+0

Что вы имеете в виду, когда говорите, что это не удалось? Какой результат вы получили и чего вы ожидали? –

+0

Для печати указателей вы должны использовать 'printf ("% p ", (void *) (p))'. «Содержание% esp» является указателем. –

+0

@CarlNorum: Нет, использование 'printf' просто определяется стандартом C. (См. «Variadic arguments».) –

ответ

5

Если вы используете GNU-систему, вы можете использовать расширение GNU для библиотеки C для обработки обратных трасс, см. 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

Это выглядит прекрасным способом, но мне нужно реализовать это, используя функции сборки (для каждого требования к присваиванию). Я должен был указать это в своей проблеме изначально. – Nate

+0

Важно, чтобы вы задавали домашние вопросы как домашнюю работу. – dreamlax

+0

Извините. Отредактировано оригинальное сообщение. – Nate

4

get_esp возвращается esp она находится в пределах функции. Но это не то же самое, что esp в вызывающей функции, потому что операция вызова изменяется esp.

Я рекомендую заменить функцию частью встроенной сборки. Таким образом, esp не изменится, когда вы попытаетесь его прочитать.

Кроме того, печать на sderr не помогла бы. По моему опыту, stderr работает намного лучше.

Смежные вопросы