Утечки памяти

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем ATishchenko, 30 окт 2017.

Метки:
  1. ATishchenko

    ATishchenko Нерд

    Доброго времени суток!
    Столкнулся с проблемой с Iskra JS - после 5-6-ти часов отправки данных по HTTP на некий облачный сервис начинают валиться ошибки о нехватке памяти. При использовании HTTPS эти ошибки начинают валиться практически сразу - через одну/две посылки.
    Есть какие-нибудь хинты? Может как-то можно "мусорщика" пинать? Или код в студию?
     
  2. DIYMan

    DIYMan Guest

    Лучше да.
     
  3. ATishchenko

    ATishchenko Нерд

    Вот код:

    //Adafruit UserName
    var NAME = "XXXXXXX";
    //Adafruit AIO-Key
    var AIOKEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    // Group ID
    var GROUP = "multitest";

    //WiFi
    var SSID = "SSID";
    var PASSWORD = "PASSWORD";
    I2C1.setup({scl: SCL, sda: SDA});

    var mySensor = require("@amperka/thermometer").connect(A1);
    console.log("Temp: ", mySensor.read("C"));
    var myBaro = require("@amperka/barometer").connect();
    var compass = require("@amperka/magnetometer").connect(I2C1, 0x1C);
    var https = require("http");

    myBaro.init();

    var opts = {
    host: 'io.adafruit.com',
    port: 80,
    path: '/api/v2/'+NAME+'/groups/'+GROUP+'/data',
    method: 'POST',
    protocol: 'http:',
    headers: {
    'X-AIO-Key': AIOKEY,
    'Content-Type': 'application/json',
    'Content-Length': 0
    }
    };

    function sendMessage(callback) {
    var message = {
    feeds: [
    {key: "temperature", value: mySensor.read("C").toFixed(2)},
    {key: "pressure", value: myBaro.read("mmHg").toFixed(2)},
    {key: "tempo", value: myBaro.temperature("C").toFixed(2)}
    ]
    };
    var content = JSON.stringify(message);
    opts.headers['Content-Length'] = content.length;
    var request = https.request(opts, function(res) {
    var response = '';
    res.on('data', function(d) {
    response += d;
    });
    res.on('close', function() {
    var json = JSON.parse(response);
    if (callback) {
    callback(json);
    }
    });
    });
    request.end(content);
    request.on('error', function(err) {
    console.log('ERROR: ', err);
    });
    }

    function run() {
    setInterval(function() {
    sendMessage();
    }, 10000);
    }

    var wifi = require("@amperka/wifi").setup(function(err) {
    wifi.connect(SSID, PASSWORD, function(err) {
    wifi.getIP(function(err, ip) {
    if (!err) {
    console.log("My IP: ", ip);
    }
    });
    run();
    });
    });
     
  4. DIYMan

    DIYMan Guest

    Что могу посоветовать: почаще поставить вызов console.log, чтобы хотя бы примерно локализовать проблемный участок. Это первое. Второе - помодульно отказываться от библиотек, чтобы понять - какая вызывает проблему. Т.е. задача - получить минимальный код, который - либо работает без нареканий, либо - стопроцентно воспроизводит проблему. Только тогда можно будет сделать вывод о том, в чём проблема.

    Начните с простого: последовательно откажитесь от термометра, барометра, магнетометра, вместо их данных подставив в message какие-нибудь жёстко прошитые значения - и смотрите, будет ли возникать проблема.
     
    arkadyf нравится это.
  5. Morgan

    Morgan Гик

    На старых версиях прошивки был баг с GET-запросами, там постоянно рос размер объекта запроса.
    Обновитесь до 1v92.

    Сборщик мусора вызывается командой process.memory()
     
    Konkery, brokly и arkadyf нравится это.
  6. ATishchenko

    ATishchenko Нерд

    Спасибо за сборщика. Потестирую. Я на 1v92. От https пришлось отказаться - ошибки памяти при построении запроса начинают сыпаться практически тут же.
     
  7. ATishchenko

    ATishchenko Нерд

    Ок. Попробую.
     
  8. Morgan

    Morgan Гик

    это всё круто конечно, но не плохо бы скинуть логи.
     
  9. ATishchenko

    ATishchenko Нерд

    Сегодня предоставлю.
     
  10. ATishchenko

    ATishchenko Нерд

    Вот ошибка, которая выпадает при использовании https:
    Uncaught InternalError: Failed! mbedtls_ssl_setup: Not enough memory
    at line 22 col 22
    request.end(content);
    ^
    in function "sendMessage" called from line 1 col 13
    sendMessage();
    ^
    in function called from system
    Uncaught InternalError: Failed! mbedtls_ssl_setup: Not enough memory
    at line 22 col 22
    request.end(content);
    ^
    in function "sendMessage" called from line 1 col 13
    sendMessage();
    ^
    in function called from system
     
  11. ATishchenko

    ATishchenko Нерд

    Вот это прилетает после суток/двух работы по HTTP:
    ERROR: Out of Memory!
    Execution Interrupted
    at line 1 col 675
    ..."+(a?a:"Timeout")+")")))}),c)
    ^
    in function called from line 22 col 22
    request.end(content);
    ^
    WARNING: Out of memory while appending to array
    ERROR: Error processing Serial data handler - removing it.
    ERROR: Ctrl-C while processing interval - removing it.
    Execution Interrupted during event processing.
    at line 1 col 129
    ...ction(){d=void 0;b&&b()},c),p=function(a){d=void 0;var f;b&&...
    ^
    in function "cmd" called from line 1 col 111
    ...hin function "d" called from line 1 col 324
    ...c&&(e[c](k),n=!0);n||d&&d(k)}a=a.substr(f+1);"\n"==a[0]&&(a=..in function called from system
    at line 1 col 256
    ...ft(),h.cat line 22 col 22
    requExecution Interrupted
    Execution Interrupted