我可以使用以下代码在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)
我无法想出一个解决方法。这可以解决吗?
答案 0 :(得分:1)
在您的描述和可重现的测试用例中有一个问题
可以修复吗?
是的,我很确定它可以修复;-) - 在固件中。 https://github.com/nodemcu/nodemcu-firmware/issues/1383已经存在问题。