Различие в стеках вызовов на x86 и x64

234
28 февраля 2018, 09:33

Я реализовываю логирование информации о выброшенных исключениях (информация включает в себя стэк вызовов). Я спрашивал недавно как можно реализовать логирование стэка вызовов https://stackoverflow.com/questions/48924449/reliable-way-to-print-exception-backtrace-in-catch-handler. И решил проверить стэки на платформах x86 и x64. Результаты сравнения немного удивили меня. Вот программа:

#include <iostream>
#include <Windows.h>
using namespace std;
struct A
{
};
void foo3()
{
    throw A();
}
void foo2()
{
    foo3(); 
}
void foo1()
{
    foo2();
}
void foo()
{
    try
    {
        foo1();
    }
    catch(...)
    {
        cout << "exception rethrowing" << endl;
        throw;
    }
}
int seh_filter(_EXCEPTION_POINTERS* exception)
{
    cout << "SEH FILTER" << endl;
    return EXCEPTION_EXECUTE_HANDLER;
}
int main(void)
{
    __try
    {
        foo();
    }
    __except(seh_filter(GetExceptionInformation()))
    {
        cout << "SEH catch handler" << endl;
    }
    return 0;
}

Установил точку остановки в seh_filter чтобы просмотреть стэк (запустил дебажные сборки). Вот изображения:

Не могу понять, почему так сильно различаются стэки (особенно под x64). Я только слышал что изменилась обработка seh исключений под x64. Использую msvc2013 под Windows 10.

READ ALSO
Какие отношения типов использовать в SFINAE для конструктора с perfect forwarding?

Какие отношения типов использовать в SFINAE для конструктора с perfect forwarding?

Несколько запутался с проверкой типов в SFINAEДопустим, есть:

192
LLVM. AddressSanitizer.Is a value operand of store Instruction function parameter

LLVM. AddressSanitizer.Is a value operand of store Instruction function parameter

В файле AddressSanitizercpp есть функция AddressSanitizer::instrumentStoreInstruction(

221
Пауза консоли в C++

Пауза консоли в C++

Какие функции в Visual Studio (помимо system("pause");) останавливают закрытие консоли

245
Собрать и объяснить код (пример с сайта)

Собрать и объяснить код (пример с сайта)

Имееться код hash-алгоритмаТак как его надо исследовать, необходимо его запустить (для начала)

258