Мой первый WASM, созданный в Rust, выдает следующую ошибку, я понятия не имею, как отладить ее.
wasm-000650c2-23:340 Uncaught RuntimeError: memory access out of bounds
at dlmalloc::dlmalloc::Dlmalloc::free::h36961b6fbcc40c05 (wasm-function[23]:670)
at __rdl_dealloc (wasm-function[367]:8)
at __rust_dealloc (wasm-function[360]:7)
at alloc::alloc::dealloc::h90df92e1f727e726 (wasm-function[146]:100)
at <alloc::alloc::Global as core::alloc::Alloc>::dealloc::h7f22ab187c7f5835 (wasm-function[194]:84)
at <alloc::raw_vec::RawVec<T, A>>::dealloc_buffer::hdce29184552be976 (wasm-function[82]:231)
at <alloc::raw_vec::RawVec<T, A> as core::ops::drop::Drop>::drop::h3910dccc175e44e6 (wasm-function[269]:38)
at core::ptr::real_drop_in_place::hd26be2408c00ce9d (wasm-function[267]:38)
at core::ptr::real_drop_in_place::h6acb013dbd13c114 (wasm-function[241]:50)
at core::ptr::real_drop_in_place::hb270ba635548ab74 (wasm-function[69]:192)
Контекст: последний код Chrome, wasm-bindgen в Rust, вызванный из пользовательского элемента TypeScript, работающий на холсте в теневом DOM. Данные, отображаемые на холст, поступают из HTML5 AudioBuffer. Все переменные ржавчины имеют локальную область действия.
Веб-компонент работает отлично, если в документе появляется только один экземпляр, но если я добавлю еще экземпляры, трассировка стека будет выгружена, как указано выше. Код работает без каких-либо других проблем.
Я знаю, что в Chrome есть выдающиеся ошибки памяти - это то, на что они похожи, или опытный разработчик Rust / Wasm скажет мне, если это необычно?
js-sys = "0.3.19"
wasm-bindgen = "0.2.42"
wee_alloc = { version = "0.4.2", optional = true }
[dependencies.web-sys]
version = "0.3.4"
Код ржавчины невелик и просто отображает два канала AudioBuffer для поставляемого HTMLCanvasElement:
#[wasm_bindgen]
pub fn render(
canvas: web_sys::HtmlCanvasElement,
audio_buffer: &web_sys::AudioBuffer,
stroke_style: &JsValue,
line_width: f64,
step_size: usize,
) {
// ...
let mut channel_data: [Vec<f32>; 2] = unsafe { std::mem::uninitialized() }; // !
for channel_number in 0..1 {
channel_data[channel_number] = audio_buffer
.get_channel_data(channel_number as u32)
.unwrap();
}
// ...
Я попытался закомментировать функциональность, и если код не касается основы, но выполняет вышеуказанные действия, я получаю сообщение об ошибке. Внесение изменений, приведенных ниже, приводит к простой ошибке «Недостаточно памяти». Аудио файл имеет размер 1200 кб
let channel_data: [Vec<f32>; 2] = [
audio_buffer.get_channel_data(0).unwrap(),
audio_buffer.get_channel_data(1).unwrap()
];
РЕДАКТИРОВАТЬ : последняя ошибка out of memory
для правильного кода выше действительно вызвала меня, но на самом деле это ошибка Chrome .