Странная разница в стеке вызовов между release и debug

#c #callstack

#c #callstack

Вопрос:

Я пытаюсь обойти стек этого примера программы:

 #include <windows.h>

void Func1()
{
    Sleep(1000);
}

void Func2()
{
    Sleep(1000);
    Func1();
}

void Func3()
{
    Sleep(1000);
    Func2();
}

void main()
{
    for (int i = 0; i < 100; i  )
    {
        Func3();
    }
}
  

В режиме отладки я получаю то, что вы ожидаете. Что-то вроде:
Сон
Func3
main

В режиме release (с включенной оптимизацией указателя фрейма) Я получаю stack:
Sleep
main

Куда делась функция между «main» и «sleep» при запуске релиза?

Комментарии:

1. Вероятно, это было встроено компилятором.

2. Помните: стек вызовов — это привилегия, которая удаляется, как только вы включаете оптимизацию. (На самом деле, вы можете просто отключить FPO: msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.71).aspx )

3. Я знаю, но я на самом деле пытаюсь использовать FPO callstack. Это выполнимо, если у вас есть PDF-файлы, и это то, что я пытаюсь сделать. 🙂

4. Да, они были встроены. Я просто меняю «Расширение встроенной функции» на Only_inline, и появляется отсутствующая функция. 🙂

5. @Idov, вы должны опубликовать это как ответ, а затем принять его, чтобы люди знали, каким было решение.

Ответ №1:

Функция была встроена.
Я просто меняю «Расширение встроенной функции» на Only_inline (в VS2008), и появляется отсутствующая функция. 🙂