记一例 libuv.lib 引起的崩溃

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 指令集 lua_capture_error_log lua_use_default_type lua_malloc...
    吃瓜的东阅读 12,072评论 0 2
  • # 模块机制 node采用模块化结构,按照CommonJS规范定义和使用模块,模块与文件是一一对应关系,即加载一个...
    RichRand阅读 2,544评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,368评论 0 6
  • 二、初见 最初的生命安静沉睡, 一丝不挂的灵魂, 落入洁白无瑕的肉躯。 真切的黎明迎来凉意, 细细丝丝,缠住了 上...
    石莨阅读 195评论 0 1