Open3

Node.js上のEmscripten+pthreadをndbでデバッグする

okuokuokuoku

クラッシュ

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 のコンテキストで実行されるため標準のデバッガでは観察できない。

okuokuokuoku

微妙にヒープサイズが足りなかった

ndbだとちゃんと例外で止めることができて、

-sTOTAL_MEMORY=335544320 で320MiBほどにヒープを増量したら起動するようになった。

... ただし、 Emscriptenはworkerのコードを eval でロードするのでブレーク等は効かない 。一旦メインスレッド側をブレークポイントで止め、その後例外ブレークで何とか止めてやる必要がある。