Nodejs проблема генерации полезного coredump - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь следовать руководству, чтобы понять дамп ядра и узнать, как использовать плагин llnode для lldb https://developer.ibm.com/node/2016/08/15/exploring-node-js-core-dumps-using-the-llnode-plugin-for-lldb/

Первая настройка

ulimit -c unlimited

Чтобы разрешить моей системе (Ubuntu 18.04) записывать дамп ядра

Затем я создаю тест. js file

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}/`);

Я запускаю скрипт, используя

node --abort-on-uncaught-exception test.js

И заставить его выдавать ошибку, используя

curl --location --request GET 'http://localhost:1338/'

И я не вижу того же вывода, что и в учебнике. Мой вывод:

[EDIT] при использовании узла v12.8.0, я могу иметь тот же вывод, что и в учебнике

Server process 32616 running at http://127.0.0.1:1338/
Uncaught TypeError: res.not_a_function is not a function

FROM
Illegal instruction (core dumped)

У меня сформирован файл дампа памяти, но когда я пытаюсь его изучить, я не могу найти информацию о javascript вызовах функций (как показано в учебнике)

Вот возвращение моего v8 bt. Кадр 5,7, ... не показывает вызванную функцию javascript.

(llnode) v8 bt
 * thread #1: tid = 32391, 0x00007ffd8b547899 node`v8::base::OS::Abort() + 9, name = 'node', stop reason = signal SIGILL
  * frame #0: 0x00007ffd8b547899 node`v8::base::OS::Abort() + 9
    frame #1: 0x00007ffd8a829619 node`v8::internal::Isolate::Throw(v8::internal::Object, v8::internal::MessageLocation*) + 457
    frame #2: 0x00007ffd8aba3917 node`v8::internal::Runtime_ThrowCalledNonCallable(int, unsigned long*, v8::internal::Isolate*) + 71
    frame #3: 0x00007ffd8af26b79 <exit>
    frame #4: 0x00007ffd8aead1c5 <internal>
    frame #5: node`Builtins_InterpreterEntryTrampoline at base.tq:412
    frame #5: node`Builtins_InterpreterEntryTrampoline at base.tq:412
    frame #7: node`Builtins_InterpreterEntryTrampoline at base.tq:412
    frame #8: 0x00007ffd8aeacc39 <adaptor>
    frame #9: node`Builtins_InterpreterEntryTrampoline at base.tq:412
    frame #10: node`Builtins_InterpreterEntryTrampoline at base.tq:412
    frame #11: 0x00007ffd8aeb08fa <internal>
    frame #12: 0x00007ffd8aeb06d8 <entry>
    frame #13: 0x00007ffd8a814233 node`v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) + 435
    frame #14: 0x00007ffd8a81470b node`v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*) + 91
    frame #15: 0x00007ffd8a6e0fab node`v8::Function::Call(v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) + 363
    frame #16: 0x00007ffd8a5713d7 node`node::(anonymous namespace)::Parser::Proxy<int (node::(anonymous namespace)::Parser::*)(), &(node::(anonymous namespace)::Parser::on_headers_complete())>::Raw(llhttp__internal_s*) + 1111
    frame #17: 0x00007ffd8b3a702e node`llhttp__internal_execute + 990
    frame #18: 0x00007ffd8a573acf node`node::(anonymous namespace)::Parser::OnStreamRead(long, uv_buf_t const&) + 239
    frame #19: 0x00007ffd8a62abb6 node`node::LibuvStreamWrap::OnUvRead(long, uv_buf_t const*) + 166
    frame #20: node`uv__read(stream=<unavailable>) at stream.c:1239
    frame #21: node`uv__stream_io(loop=<unavailable>, w=<unavailable>, events=<unavailable>) at stream.c:1306
    frame #22: node`uv__io_poll(loop=<unavailable>, timeout=<unavailable>) at linux-core.c:431
    frame #23: node`uv_run(loop=<unavailable>, mode=<unavailable>) at core.c:380
    frame #24: 0x00007ffd8a599785 node`node::NodeMainInstance::Run() + 581
    frame #25: 0x00007ffd8a529d21 node`node::Start(int, char**) + 305
    frame #26: libc.so.6`__libc_start_main(main=(node`main), argc=3, argv=0x00007ffd89e89b38, init=<unavailable>, fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007ffd89e89b28) at libc-start.c:310
    frame #27: 0x00007ffd8a4c8ea5 node`_start + 41

Я думаю, что генерируемый дамп ядра не является правильным, потому что у меня нет того же вывода, когда мое приложение падает, но я не понимаю почему. Я запускаю свой сценарий, используя узел v13.12.0 (версия отличается от той, которая использовалась в учебнике от 2016 года)

[РЕДАКТИРОВАТЬ] При использовании узла 12.8.0 я получал те же выходные данные, что и учебник при сбое приложения.

Но когда я исследую coredump с llnode, у меня все еще нет очень явного вывода (не как в учебнике), я не вижу имя функции или аргумент, так что это все еще проблема. Я хотел бы получить почти такой же вывод, как и в учебнике (уметь исследовать содержимое аргумента и т. Д. c ...)

Здесь я выкладываю новый вывод llnode после v8 bt

(llnode) v8 bt
 * thread #1: tid = 32391, 0x00000000019f9899 node`v8::internal::compiler::RawMachineAssembler::Export() + 89, name = 'node', stop reason = signal SIGILL
  * frame #0: 0x00000000019f9899 node`v8::internal::compiler::RawMachineAssembler::Export() + 89
    frame #1: 0x0000000001055917 node`v8::internal::Runtime_WasmMemoryGrow(int, unsigned long*, v8::internal::Isolate*) + 263
    frame #2: node`Builtins_BitwiseAndSmiWideHandler at base.tq:170
    frame #3: node`Builtins_StringPrototypeSubstring at frames.tq:144
    frame #4: node`Builtins_TypedArrayPrototypeKeys at base.tq:175
    frame #5: node`Builtins_TypedArrayPrototypeKeys at base.tq:175
    frame #6: node`Builtins_StringPrototypeSubstring at frames.tq:144
    frame #7: node`Builtins_TypedArrayPrototypeKeys at base.tq:175
    frame #8: node`Builtins_TypedArrayPrototypeKeys at base.tq:175
    frame #9: node`Builtins_StringPrototypeTrimStart at frames.tq:144
    frame #10: node`Builtins_StringPrototypeTrimStart at frames.tq:144
    frame #11: 0x0000000000cc6233 node`v8::internal::(anonymous namespace)::ElementsAccessorBase<v8::internal::(anonymous namespace)::FastPackedSealedObjectElementsAccessor, v8::internal::(anonymous namespace)::ElementsKindTraits<(v8::internal::ElementsKind)6> >::TransitionElementsKind(v8::internal::Handle<v8::internal::JSObject>, v8::internal::Handle<v8::internal::Map>) + 243
    frame #12: 0x0000000000cc670b node`v8::internal::(anonymous namespace)::ElementsAccessorBase<v8::internal::(anonymous namespace)::FastPackedFrozenObjectElementsAccessor, v8::internal::(anonymous namespace)::ElementsKindTraits<(v8::internal::ElementsKind)7> >::ConvertElementsWithCapacity(v8::internal::Handle<v8::internal::JSObject>, v8::internal::Handle<v8::internal::FixedArrayBase>, v8::internal::ElementsKind, unsigned int, unsigned int, unsigned int, int) (.constprop.670) + 171
    frame #13: 0x0000000000b92fab node`v8::internal::AsmJs::InstantiateAsmWasm(v8::internal::Isolate*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Handle<v8::internal::AsmWasmData>, v8::internal::Handle<v8::internal::JSReceiver>, v8::internal::Handle<v8::internal::JSReceiver>, v8::internal::Handle<v8::internal::JSArrayBuffer>) + 6619
    frame #14: 0x0000000000a233d7 node`node::(anonymous namespace)::InitializeHttpParser(v8::Local<v8::Object>, v8::Local<v8::Value>, v8::Local<v8::Context>, void*) + 5895
    frame #15: 0x000000000185902e node`icu_64::BreakIterator::createSentenceInstance(icu_64::Locale const&, UErrorCode&) + 142
    frame #16: 0x0000000000a25acf node`node::http2::Http2Stream::diagnostic_name() const + 703
    frame #17: 0x0000000000adcbb6 node`node::inspector::InspectorIo::ThreadMain() + 2838
    frame #18: node`Builtins_SetPrototypeAdd at base.tq:2420
    frame #19: node`Builtins_SetPrototypeDelete at base.tq:2420
    frame #20: node`Builtins_StringPrototypeIncludes at base.tq:175
    frame #21: node`Builtins_RegExpPrototypeMatchAll at base.tq:170
    frame #22: 0x0000000000a4b785 node`node::worker::Message::Deserialize(node::Environment*, v8::Local<v8::Context>) + 1125
    frame #23: 0x00000000009dbd21 node`node::Start(int, char**) + 657
    frame #24: 0x00007fcb09185b97 <adaptor>

Если у кого-то есть подсказка, чтобы получить лучший вывод Может быть, это моя установка lldb / llnode, которая не годится (я пытался переустановить ее несколько раз, но не могу получить значимый вывод, такой как учебник)

...