#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), и появляется отсутствующая функция. 🙂