Как я могу напечатать содержимое стека в программе C? - PullRequest
5 голосов
/ 02 февраля 2012

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

Вот шаги, которые я предпринял:

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

    .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)
  • Я (думаю, успешно) напечатал адрес моих регистров esp и ebp (fprintf (stderr, "%x", fcP);)
  • Я пытался и не смог распечатать содержимое моего регистра esp. (Я пробовал fprintf (sderr, "%d", *fcP); и fprintf (sderr, "%x", *((int *)fcP));, среди других методов). Моя программа обнаруживает ошибку сегментации во время выполнения при обработке этой строки.

Что я делаю не так?

РЕДАКТИРОВАТЬ: Это должно быть достигнуто путем вызова этих функций сборки, чтобы получить указатели стека. EDIT2: это домашнее задание.

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

Если вы используете систему GNU, вы можете использовать расширение GNU для библиотеки C для обработки обратных следов, см. здесь .

#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);
}
4 голосов
/ 02 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...