llnode не возвращает findjsobjects

Я нахожусь в процессе отладки утечки памяти в нашем приложении узла. Однако я не могу использовать llnode, чтобы показать какие-либо объекты JavaScript. Я следовал инструкциям Брендана.

Я тестировал на разных версиях Ubuntu 16.04 и 17.04, а также на узлах 7 и 8.

Я вернулся и попробовал простой случай:

var http = require('http');
var host = "127.0.0.1"
var port = 1338

server = http.createServer(function myRequestListener(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
  res.not_a_function()
}).listen(port, host);

console.log(`Server process ${process.pid} running at http://${host}:${port}/`);

Затем я отправил бы сигнал об ошибке сегмента (приведенный выше код помещен в server.js):

kill -s SIGSEGV `ps -ax | grep server.js | cut -d " " -f 1 | head -n 1`

Я бы тогда побежал:

lldb-4.0 -c /cores/core.dump -f /usr/bin/node

Внутри, когда я запросил объекты javascript, я вернулся и опустел список.

(lldb) v8 bt
* thread #1: tid = 28763, 0x00007f8947ff7929, name = 'node', stop reason = signal SIGSEGV
  * frame #0: 0x00007f8947ff7929
    frame #1: 0x00005585e8df035b node`v8_inspector::V8FunctionCall::callWithoutExceptionHandling() + 11
    frame #2: 0x00005585e8ddf26c node`v8_inspector::V8Debugger::captureStackTrace(bool) + 92
    frame #3: 0x00005585e8bc1493 node`node::inspector::InspectorSocketServer::SocketConnectedCallback(uv_stream_s*, int) + 163
    frame #4: 0x00005585e8bbb821 node`node::inspector::InspectorConsoleCall(v8::FunctionCallbackInfo<v8::Value> const&) + 817
    frame #5: 0x00007f8947f153f1
(lldb) v8 findjsobjects
 Instances  Total Size Name
 ---------- ---------- ----
(lldb)

Где я ожидал найти объекты JavaScript. Я подозреваю, что это проблема PEBAC, но если у кого-то есть указания на то, где я мог сбиться с пути.

0 ответов

Это своего рода некропостинг, но у нас была та же проблема со сборкой электронов - v8 findjsobjects не возвращает выходных данных.

Все нижеприведенное для сборок MacOS.

Итак, проблема в флаге линкера "видимости", который вынужден быть "скрытым" в электронных сборках. Вот почему v8dbg_ константы, необходимые для llnode, не присоединяемые линкером даже при debug Конфигурация ниндзя, и llonde не может найти никаких объектов.

Чтобы справиться с этим, мы принудительно установили видимость по умолчанию с помощью pragma в сгенерированном Python файле debug-output.cc и, наконец, смогли просматривать объекты js. следовать по этому пути добавить

#pragma GCC visibility push(default)

перед объявлением нижнего колонтитула в файле electron-gn/src/v8/tools/gen-postmortem-metadata.py и восстановить весь электрон с нуля. Также сборка может быть очень большой, убедитесь, что у вас есть ~100 ГБ свободного места.

Я думаю, что то же самое будет работать для сборок node/v8 вместе с электроном.

Надеюсь это поможет.

Другие вопросы по тегам