異なるブラウザー上のWebAssemblyでC ++がクラッシュする

このメモは、asm.jsやwasmを含むさまざまなプラットフォームでC ++クラッシュを収集する方法に関する前回の記事の続きとして作成されました。 素材の量によって、これは完全な記事ではなくメモのみを描画します。C++でネイティブクライアントを作成し、ブラウザーに入れるには、常習者である必要があります。


しかし! 最近、cppconfでwasmを使用した経験について報告しました。 私が思っていたよりも多くの中毒者がいたことが判明し、そのニュースはQt for WebAssembly Technology Previewのベータ版でした 。 このメモは、実稼働環境でキャッシュをキャッチする場合に役立ちます。


カットの下:



asm.jsおよびwasmでC ++コードをキャッチするとクラッシュします。


キャッチは、グローバルwindow.onerrorハンドラーを介して行われます。


window.onerror = function(messageOrEvent, source, lineno, colno, error) { ... } 

asm.jsでは、エラーメッセージと呼び出しスタックがmessageOrEventパラメーターで渡されます。 messageOrEventのwasmの場合messageOrEvent理由は「 Error: Out of bounds memory access (evaluating 'dynCall(rawFunction, a1, a2, a3)')RuntimeError: index out of boundsなどのようなものです。
そして、 errorは呼び出しスタックを取得します。


スタック


コンパイル時に--emit-symbol-mapスイッチを使用します。これにより、関数名が最小化されます。 コンパイル後、いわゆるシンボルファイルを取得します。


これは、asm.jsの文字ファイルです。


 ljd:___cxx_global_array_dtor_11639 YZb:___cxx_global_array_dtor_40_30909 Ya:_glClearStencil 

wasmの場合、これは関数番号と関数名です。


 14:_glStencilFunc 15:_glUniformMatrix4fv 16:_emscripten_set_touchend_callback 17:_glGenRenderbuffers 18:_emscripten_set_webglcontextlost_callback 19:_glUniform2fv 

異なるブラウザのスタックは異なって見えます


Safari:


 wasm function: 5960@[wasm code] wasm function: 5984@[wasm code] wasm function: 5981@[wasm code] wasm function: 1233@[wasm code] wasm function: 1232@[wasm code] wasm function: 34895@[wasm code] wasm function@[wasm code] dynCall_viii@[native code] 

Firefox:


 wasm-function[5960]@https://path_to_source wasm-function[5984]@https://path_to_source wasm-function[5981]@https://path_to_source wasm-function[1233]@https://path_to_source wasm-function[1232]@https://path_to_source wasm-function[34895]@https://path_to_source dynCall_viii_419@https://path_to_source 

Chrome:


  at wasm-function[2007]:11 at wasm-function[11257]:228 at wasm-function[11606]:479 at wasm-function[11604]:1726 at wasm-function[11819]:91 at wasm-function[9055]:274 at wasm-function[9052]:26 at wasm-function[2721]:92 at wasm-function[1302]:2523 at wasm-function[4946]:69 

Chromeは、機能番号2007だけでなく、 11のオフセットも提供します。 また、クロムを使用すると、コードをテキスト形式で表示できます。 スクリーンショットでは、コードは276関数です。

これは、たとえば、 未定義の動作が発生する場合に便利です。


残っているのは、関数番号を引き出してファイル内の関数にマップし、 abi::__cxa_demangleを通過して、読み取り可能な呼び出しスタックを取得することだけです。



Source: https://habr.com/ru/post/J343784/


All Articles