【问题标题】:nginx: [error] failed to initialize Lua VMnginx:[错误] 未能初始化 Lua 虚拟机
【发布时间】:2015-04-10 09:53:21
【问题描述】:

我正在尝试使用 valgrind 检查我的 nginx 模块中的内存泄漏。我正在尝试以下命令

valgrind --leak-check=full --tool=memcheck --show-reachable=yes --log-file="/tmp/val.out" -v /usr/local/nginx -c /usr/ local/conf/nginx.conf

我收到错误 nginx: [error] failed to initialize Lua VM

我在 Cent OS 7 和 lua 0.9.15 上使用 nginx-1.6.2。

【问题讨论】:

    标签: nginx lua valgrind centos7


    【解决方案1】:

    我遇到了同样的问题,通过升级 Valgrind 并在 LuaJIT 编译中添加一些额外的标志来解决这个问题。

    查看:

    • https://github.com/openresty/lua-nginx-module/issues/681
      具体来说:

      • ==52538== 使用 Valgrind-3.10.0 和 LibVEX;

      • 您的 valgrind 版本不支持 LuaJIT 自己的分配器所需的 MAP_32BIT 标志。您需要旧版本的 valgrind(如 3.8.1)或新版本(如 3.11.0)。

    • https://groups.google.com/forum/#!topic/openresty/riEO_YXTwz4
      具体来说(使用谷歌翻译):

      这是因为 LuaJIT 自带的内存分配器 MAP_32BIT 在 Linux x86_64 上面使用这个标志来调用 mmap() 系统调用。并且 Valgrind 3.9.0 从 mmap 不再支持 MAP_32BIT 这个标志,它会使 LuaJIT 初始化失败。

      解决办法是重新编译一个特殊版本的LuaJIT,强制它使用dispenser系统,在编译LuaJIT时使用这样的命令:

      制作 CCDEBUG=-g Q= XCFLAGS='-DLUAJIT_USE_VALGRIND -DLUAJIT_USE_SYSMALLOC'

      这里最重要的是LUAJIT_USE_SYSMALLOC这个宏。当然,为了获得最佳效果,您还应该指定以下 C 编译器选项:

      -DLUA_USE_APICHECK -DLUA_USE_ASSERT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 2019-02-06
      • 2014-07-07
      • 1970-01-01
      • 2011-05-01
      • 2017-12-24
      相关资源
      最近更新 更多