Как получить обратную трассировку или иным образом отладить «не удалось инициировать панику» при использовании Rust с неоновыми привязками? - PullRequest
2 голосов
/ 28 октября 2019

Я написал собственный модуль Node, используя Rust + Neon Bindings . Общая цель - запросить базу данных, расшифровать результаты и вернуть массив JSON в Node. Для некоторых наборов данных это работает как ожидалось, однако для других это вызывает панику. Я пытаюсь отладить его, но не могу понять, как получить трассировку стека. Единственный вывод:

fatal runtime error: failed to initiate panic, error 5
    Abort trap: 6

Мои попытки отладки включают в себя:

  • , включая "backtrace" в Cargo.toml
  • компиляция без "--release"
  • настройка RUST_BACKTRACE=1 и DEBUG=true
  • создание файла test.js для печати вывода из модуля

Сборка вывода:

> neon build
neon info running cargo
  ... all the compilation steps.
  Finished dev [unoptimized + debuginfo] target(s) in 2m 17s
neon info generating native/index.node

Тестовый файл:

const Addon = require('./lib');
const addon = new Addon();
(async function() {
  console.log(`process.env.RUST_BACKTRACE = ${process.env.RUST_BACKTRACE}`);
  const i = await addon.getData(237);
  console.log(i, i.length)
}());

Тестовый вывод:

> RUST_BACKTRACE=1 DEBUG=true node test.js 
process.env.RUST_BACKTRACE = 1
fatal runtime error: failed to initiate panic, error 5
Abort trap: 6

Для других значений, переданных в addon.getData(), я получаю массив данных JSON, как и ожидалось. Сбой набора данных довольно велик, поэтому я не смог определить какие-либо различия.

> rustc --version
rustc 1.38.0 (625451e37 2019-09-23)
> cargo --version
cargo 1.38.0 (23ef9a4ef 2019-08-20)
> node --version
v11.15.0
> neon version
0.3.1

Я реализовал синхронную версию кода, а также асинхронную с использованием в этом примере . Асинхронный обратный вызов преобразуется в Promise в ./lib/index.js. После обновления test.js для использования синхронной версии кода я получил следующий вывод:

(node:45229) UnhandledPromiseRejectionWarning: Error: internal error in Neon module: called `Option::unwrap()` on a `None` value

Я добавил в свой код набор println!() s и смог найти ошибку (отсутствующее обязательное свойство для расшифрованного объекта JSON), но так и не удалось получить правильную трассировку стека. Похоже, что Неон, должно быть, проглотил их в асинхронном коде.

...