http模块中的NodeMCU内存泄漏(帖子)

时间:2016-07-15 13:46:19

标签: http memory-leaks lua nodemcu

我可以使用以下代码在NodeMCU http模块(post)中可靠地重现内存泄漏:

msgData="This is some data that is being sent to the server; data is logged by the server"
function logWrite(str)
    str=tostring(tmr.time()).." -> "..tostring(node.heap()).." - "..str
    print(str)
end

function sendData()
    logWrite("sendData(sending)")

    http.post("http://192.168.2.38/DeviceScan.py", "Content-Type: text/plain\r\n", msgData,

      function(rspCode, payload)
          logWrite("sendData(http callback), rspCode="..tostring(rspCode))
          rspCode=nil
          payload=nil
      end)
end

status=tmr.alarm(1, 3000, tmr.ALARM_AUTO, sendData)

上面的代码产生以下输出:

148 -> 43112 - sendData(sending)
148 -> 42240 - sendData(http callback), rspCode=200
151 -> 43112 - sendData(sending)
151 -> 42240 - sendData(http callback), rspCode=200
154 -> 43112 - sendData(sending)
154 -> 42240 - sendData(http callback), rspCode=200
157 -> 43112 - sendData(sending)
157 -> 42240 - sendData(http callback), rspCode=200
160 -> 43112 - sendData(sending)
160 -> 42240 - sendData(http callback), rspCode=200
163 -> 43112 - sendData(sending)
164 -> 42240 - sendData(http callback), rspCode=200
166 -> 43112 - sendData(sending)
166 -> 42648 - sendData(http callback), rspCode=-1
169 -> 42976 - sendData(sending)
169 -> 42496 - sendData(http callback), rspCode=-1
172 -> 42840 - sendData(sending)
172 -> 42368 - sendData(http callback), rspCode=-1
175 -> 42704 - sendData(sending)
175 -> 42216 - sendData(http callback), rspCode=-1

636 -> 24536 - sendData(http callback), rspCode=-1
639 -> 24872 - sendData(sending)
639 -> 24008 - sendData(http callback), rspCode=200
642 -> 24872 - sendData(sending)
642 -> 24008 - sendData(http callback), rspCode=200
645 -> 24872 - sendData(sending)
645 -> 24008 - sendData(http callback), rspCode=200
648 -> 24872 - sendData(sending)
648 -> 24008 - sendData(http callback), rspCode=200
651 -> 24872 - sendData(sending)
651 -> 24008 - sendData(http callback), rspCode=200
654 -> 24872 - sendData(sending)
654 -> 24008 - sendData(http callback), rspCode=200
657 -> 24872 - sendData(sending)
657 -> 24008 - sendData(http callback), rspCode=200
660 -> 24872 - sendData(sending)
660 -> 24008 - sendData(http callback), rspCode=200
663 -> 24872 - sendData(sending)
663 -> 24008 - sendData(http callback), rspCode=200
666 -> 24872 - sendData(sending)
666 -> 24008 - sendData(http callback), rspCode=200
669 -> 24872 - sendData(sending)
669 -> 24008 - sendData(http callback), rspCode=200
672 -> 24872 - sendData(sending)
672 -> 24008 - sendData(http callback), rspCode=200
675 -> 24872 - sendData(sending)
675 -> 24008 - sendData(http callback), rspCode=200
678 -> 24872 - sendData(sending)
678 -> 24536 - sendData(http callback), rspCode=-1
681 -> 24872 - sendData(sending)
681 -> 24400 - sendData(http callback), rspCode=-1
684 -> 24736 - sendData(sending)
684 -> 24264 - sendData(http callback), rspCode=-1
687 -> 24600 - sendData(sending)
687 -> 24128 - sendData(http callback), rspCode=-1
690 -> 24464 - sendData(sending)
690 -> 23992 - sendData(http callback), rspCode=-1
693 -> 24328 - sendData(sending)
693 -> 23856 - sendData(http callback), rspCode=-1

1240 -> 1688 - sendData(sending)
1240 -> 1216 - sendData(http callback), rspCode=-1
1243 -> 1552 - sendData(sending)
1243 -> 1080 - sendData(http callback), rspCode=-1
1246 -> 1416 - sendData(sending)
1246 -> 944 - sendData(http callback), rspCode=-1
E:M 768

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

首次运行代码时,服务器已启动并正在运行,内存使用情况稳定。

在时间戳166之前服务器关闭(模拟网络/服务器故障)并且可用内存开始减少。

在时间戳639之前,服务器重新启动并且内存使用稳定。

在时间戳678之前,服务器再次关闭,可用内存再次开始减少。可用内存继续减少,直到内存分配错误导致重置。

问题的一个线索是每次http.post调用后内存减少与http请求的消息体大小直接相关。消息体越大,可用内存减少的越多。

我正在使用以下版本:

NodeMCU custom build by frightanic.com
    branch: dev
    commit: c0f1e028a64d3aeb399a65b9c44eb512f21da62a
    SSL: true
    modules: file,gpio,http,net,node,rtctime,tmr,uart,wifi
 build  built on: 2016-05-16 19:30
 powered by Lua 5.1.4 on SDK 1.5.1(e67da894)

我无法想出一个解决方法。这可以解决吗?

1 个答案:

答案 0 :(得分:1)

在您的描述和可重现的测试用例中有一个问题

  

可以修复吗?

是的,我很确定它可以修复;-) - 在固件中。 https://github.com/nodemcu/nodemcu-firmware/issues/1383已经存在问题。