美文网首页我用 Linux
记一例 libuv.lib 引起的崩溃

记一例 libuv.lib 引起的崩溃

作者: wyrover | 来源:发表于2017-10-24 16:53 被阅读89次

libuv 作为 node 的底层库,在错误处理方面只是简单的 abort(),很野蛮,显然这是为单进程的 node 服务的。

双11临近了,作为windows 上的 daemon 服务程序,需要定时运行一些任务。包装了 libuv 的 luv 刚好满足这个需求,lua 方便的改变业务逻辑,并且依靠 libuv 的定时器和文件监视模块做定时逻辑。不过 libuv 的错误处理太过野蛮,用这个模块导致程序崩溃退出就得不偿失。下面给出错误处理例子,然后在线程中初始化 luv 环境。

#include <csetjmp>
#include <csignal>
#include <cstdlib>
#include <iostream>
#include <Windows.h>
#include <process.h>

jmp_buf env;

void on_sigabrt(int signum)
{
    longjmp(env, 1);
}

void try_and_catch_abort(void (*func)(void))
{
    if (setjmp(env) == 0) {
        signal(SIGABRT, &on_sigabrt);
        (*func)();
    } else {
        std::cout << "aborted\n";
    }
}

void do_stuff()
{
    std::cout << "step 1\n";
    std::cout << "step 2\n";
}



void do_stuff_aborted()
{
    std::cout << "step 1\n";
    abort();
    std::cout << "step 2\n";
}

extern "C" UINT __stdcall run_lua_in_thread(LPVOID lParam)
{
    try_and_catch_abort(&do_stuff_aborted);
    try_and_catch_abort(&do_stuff);
    return 0;
}

int main()
{
    HANDLE hThread;
    hThread = (HANDLE)_beginthreadex(NULL, 1024 * 1024 * 2, run_lua_in_thread, NULL, 0, NULL);

    if (hThread) {
        SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL);
        CloseHandle(hThread);
        hThread = NULL;
    }

    system("pause");
    return 0;
}

相关文章

网友评论

    本文标题:记一例 libuv.lib 引起的崩溃

    本文链接:https://www.haomeiwen.com/subject/pklxpxtx.html