Cra sh Дамп и SEH с ошибкой разматывания аргумента variadi c - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать оболочку потока , которая будет выполнять лямбда-функцию с N параметрами INSIDE a __try / __except как здесь определено: https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=vs-2019

Приложение не должно восстанавливаться после исключения. Он завершится сразу после вызова функции Windows для генерации Cra sh Dump , как здесь: https://docs.microsoft.com/en-us/windows/win32/dxtecharts/crash-dump-analysis

Поскольку это оболочка потока , я должен сделать ее как можно более обобщенной c, учитывая любые типы лямбда-сигнатур (при условии, что все они возвращают void).

class MiniThread {
public:
    template<typename F, typename... Args>
    void run(F func, Args... args)
    {
        if (m_thread != nullptr)
            join();

        m_thread = new std::thread([&]() {
            _run(func, std::forward<Args>(args)...);
        });

        m_started = true;
    }

    bool started() const { return m_started; }
    void join();

    ~MiniThread();
private:
    template<typename F, typename... Args>
    void _run(F func, Args... args)
    {
        __try
        {
            func(std::forward<Args>(args)...);
        }
        __except (CrashDump::GenerateDump(GetExceptionInformation()))
        {
            // TODO: log.
        }
    }

    std::thread *m_thread = nullptr;
    bool m_started = false;
};

Мое тестовое использование таково:

// any parameters/arguments should work.
auto lambda = [this](std::string whatever, std::promise<uint> && p) {
    // anything should work here.
};

std::promise<uint> promise;
std::string whatever = "whatever";
MiniThread thread;
thread.run(lambda, promise);

К сожалению, попытка построить это на Visual Studio 2017 вызывает следующую ошибку:

Error C2712 Cannot use __try in functions that require object unwinding

Я пытался "спрятать" код глубже в стек вызовов функций, но я предполагаю, что std::forward упакованных variadic args не позволяет мне.

Пожалуйста, поймите, что мне ДЕЙСТВИТЕЛЬНО не нужно приложение для восстановления после cra * sh. Просто для того, чтобы сгенерировать дамп cra sh и завершить его.

...