Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行Lua垃圾回收会导致C堆栈溢出_C_Lua_Stack Overflow - Fatal编程技术网

执行Lua垃圾回收会导致C堆栈溢出

执行Lua垃圾回收会导致C堆栈溢出,c,lua,stack-overflow,C,Lua,Stack Overflow,我正在微控制器环境中运行Lua,使用RTOS。 可用资源非常有限(只有几kb的RAM),我正在努力确保Lua在这种环境中正常工作 为了对整个固件进行压力测试,并确保正确处理内存,我加载了一个脚本,该脚本基本上执行以下操作: index = 1 data = {} -- This function is called repeatedly, till memory exhaustion. function test() data[index] = 5 data[index + 1

我正在微控制器环境中运行Lua,使用RTOS。 可用资源非常有限(只有几kb的RAM),我正在努力确保Lua在这种环境中正常工作

为了对整个固件进行压力测试,并确保正确处理内存,我加载了一个脚本,该脚本基本上执行以下操作:

index = 1
data = {}

-- This function is called repeatedly, till memory exhaustion.
function test()
    data[index] = 5
    data[index + 1] = 6
    data[index + 2] = 7
    index = index + 3
end
我期望从这个函数中得到的是使Lua耗尽内存(内存,由于连续分配)

令我惊讶的是,这个计划以另一种方式失败了。 随着内存使用的增加,Lua调用垃圾收集器来释放一些内存。每次垃圾收集器运行时,它都会使用越来越多的堆栈,导致堆栈在堆耗尽之前很久就溢出。看起来,无论我如何增加堆栈大小,垃圾收集器都会很快将其全部吃掉

注意,我在这里谈论的是C运行时堆栈,CPU在硬件上访问的实际内存,而不是LuaAPI堆栈

这是预期的行为吗?我希望垃圾收集器有特定的工作要做,它应该为每次执行消耗相同的内存


有没有办法处理垃圾收集来改善这种情况?

您是否根据系统上的堆栈大小设置了
LUAI_MAXCCALLS
?@Egor Skriptunoff没有。您能详细说明一下吗?这是否也能解决GC溢出问题?有什么方法可以分析我的应用程序以找到正确的限制?在构建Lua时,将
LUAI_MAXCCALLS
设置为sane值是您的责任。当嵌套的C调用数超过此常量时,Lua使用此常量引发“C堆栈溢出异常”。这是Lua中唯一的堆栈溢出保护。它与GC无关。我的问题是GC的工作方式。这些例程导致堆栈溢出,而不是脚本本身的执行。您是重复执行整个脚本,还是只执行测试函数?