Я написал собственный модуль 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), но так и не удалось получить правильную трассировку стека. Похоже, что Неон, должно быть, проглотил их в асинхронном коде.