-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
使用 skynet.memlimit 导致 core dump #494
Comments
我测了一下,重现了,初步猜测是内存限制下,共享函数原型那块的代码内存分配失败但没有做检查,然后直接crash了。 估计云大增加的共享proto这块的内存分配都要增加检查? 开启调试符号,挂在了这一行: f->p=luaM_newvector(L,n,struct Proto *);
for (i=0; i<n; i++) f->p[i]=NULL;
for (i=0; i<n; i++) {
f->p[i]=cloneproto(L, src->p[i]); // 这里
} |
谢谢。这是个很隐晦的 bug ,看看我的新提交,帮忙 review 一下 :) 简单描述一下问题: 写这段代码是考虑了内存分配不足的,但由于没有实际测试过,漏掉了一种情况。 proto 对象需要先关联在结构中,然后才能填写内部数据。否则,在内存分配失败时,lua gc 会尝试跑一遍收集,试图回收掉不用的内存。由于 proto 对象没有事先挂接,刚刚申请的对象就立刻被回收掉了,同时内存又变得够用,内存分配正常返回。而前面分配的对象已经释放,这样 修改方法是,把 |
赞! 我要抓紧学习Lua源码了 |
测试脚本中的这段代码
改成
还是会出现 core dump
|
bugfix issue cloudwu#494
这次查了一下,好像不是修改 lua vm 引起的 bug ,而是 lua gc 本身的 bug :) 我先在原版 lua 那里写个 testcase 重现一下。 |
不好意思,还是我的问题。 原版 lua 是在保证 而修改版本, |
bugfix issue cloudwu#494
将 test/testmemlimit.lua 修改如下,即可出现
core backtrace 如下:
The text was updated successfully, but these errors were encountered: