Open3
Node.js上のEmscripten+pthreadをndbでデバッグする
Node.jsの標準インスペクタ( --inspect
で有効にできてChrome devtoolsで見るやつ)は Worker
を見られないので ndb
を代わりに使う必要があった。
クラッシュ
Error [RuntimeError]: Aborted(OOM). Build with -s ASSERTIONS=1 for more info.
at abort (eval at importScripts (F:\wasmlldb\wasm\bin\lldb.worker.js:39:16), <anonymous>:538:10)
at abortOnCannotGrowMemory (eval at importScripts (F:\wasmlldb\wasm\bin\lldb.worker.js:39:16), <anonymous>:4297:2)
at _emscripten_resize_heap (eval at importScripts (F:\wasmlldb\wasm\bin\lldb.worker.js:39:16), <anonymous>:4303:2)
at sbrk (<anonymous>:wasm-function[17099]:0x490194)
at dlmalloc (<anonymous>:wasm-function[2504]:0x123edf)
at dlmemalign (<anonymous>:wasm-function[29515]:0x730030)
at __pthread_create (<anonymous>:wasm-function[42182]:0xa5ce59)
at lldb_private::ThreadLauncher::LaunchThread(llvm::StringRef, std::__2::function<void* ()>, unsigned long) (<anonymous>:wasm-function[17991]:0x4abecc)
at lldb_private::CommandInterpreter::RunCommandInterpreter(lldb_private::CommandInterpreterRunOptions&) (<anonymous>:wasm-function[58948]:0xe236ab)
at main (<anonymous>:wasm-function[74027]:0x12bc6e1)
Emitted 'error' event on process instance at:
at emitUnhandledRejectionOrErr (internal/event_target.js:579:11)
at MessagePort.[nodejs.internal.kHybridDispatch] (internal/event_target.js:403:9)
at MessagePort.exports.emitMessage (internal/per_context/messageport.js:18:26)
LLDBをビルドして実行してみると、起動時にいきなりクラッシュしてしまった。この abortOnCannotGrowMemory
が worker のコンテキストで実行されるため標準のデバッガでは観察できない。
微妙にヒープサイズが足りなかった
ndbだとちゃんと例外で止めることができて、
-sTOTAL_MEMORY=335544320
で320MiBほどにヒープを増量したら起動するようになった。
... ただし、 Emscriptenはworkerのコードを eval
でロードするのでブレーク等は効かない 。一旦メインスレッド側をブレークポイントで止め、その後例外ブレークで何とか止めてやる必要がある。