3

Rust で作成した最初の WASM で次のエラーが発生しました。デバッグの方法がわかりません。

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、Rust の wasm-bindgen コードが TypeScript カスタム要素から呼び出され、シャドウ DOM のキャンバス上で動作します。キャンバスにレンダリングされるデータは、HTML5 AudioBuffer から取得されます。すべての錆の変数はローカルにスコープされています。

ドキュメントに 1 つのインスタンスしか表示されない場合、Web コンポーネントは完全に機能しますが、さらにインスタンスを追加すると、上記のようにスタック トレースがダンプされます。コードは他の問題なく実行されます。

Chrome には未解決のメモリ バグがあることは知っています。

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"

さびたコードは小さく、提供された HTMLCanvasElement に AudioBuffer の 2 つのチャネルをレンダリングするだけです。

#[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();
    }
  // ...

機能をコメントアウトしようとしましたが、コードがキャンバスに触れていなくても上記を実行すると、エラーが発生します。以下の変更を行うと、単純な「out of wam memory」エラーが発生します。音声ファイルは 1,200k です。

    let channel_data: [Vec<f32>; 2] = [
        audio_buffer.get_channel_data(0).unwrap(),
        audio_buffer.get_channel_data(1).unwrap()
    ];

編集:上記の正しいコードの後者のout of memoryエラーは本当に私を投げましたが、実際にはChromeのバグです。

4

2 に答える 2