记一例 libuv.lib 引起的崩溃

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

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

#include 
#include 
#include 
#include 
#include 
#include 

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;
}
  • https://github.com/wyrover/abort-in-thread-examples

你可能感兴趣的:(记一例 libuv.lib 引起的崩溃)