nginx:[错误]无法初始化Lua虚拟机。

我正在尝试使用 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 上使用 nginx-1.6.2 和 lua 0.9.15。

点赞
用户532201
用户532201

我曾经遇到过同样的问题,通过升级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,强制其使用分发系统,使用类似于以下的命令在编译LuaJIT时:

    make CCDEBUG=-g Q= XCFLAGS='-DLUAJIT_USE_VALGRIND -DLUAJIT_USE_SYSMALLOC'

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

    -DLUA_USE_APICHECK -DLUA_USE_ASSERT

2016-08-01 13:10:59