如何获取 wasm 堆栈跟踪

How to get a wasm stacktrace

我正在寻找 webassembly 上的 gdb --core 等价物。

举个例子:

//crash.cpp
#include <iostream>                                                                                                                                                             
int main() {                                                                                                                                                                    
    std::cout << "crashing soon..." << std::endl;                                                                                                                                          
    int *a = 0;                                                                                                                                                                 
    *a = 1;                                                                                                                                                                     
}                                                                                                                                                                               

我编译这个:

$ em++ -g4 crash.cpp -o crash.html --source-map-base http://localhost:8080/

并启动服务器:

$ emrun --no_browser --port 8080 crash.html

那么我怎样才能得到这个核心的堆栈跟踪dump/crash?访问页面时 chrome/firefox 上的控制台只显示一个 js 堆栈跟踪,这对我没有帮助。查看 Sources => Call stack on chrome console 只是在崩溃后显示“Not paused”。 这是在 debian 11、emscripten 2.0.12~dfsg-2、clang-11 上。

原因是您所做的不是 WebAssembly 中的错误。与许多嵌入式平台一样,写入或读取零指针在 WebAssembly 内存模型中是完全有效的操作。

然而,Emscripten 试图帮助您发现这个问题,因为 C/C++ 这是一个常见的错误,所以它所做的是检查地址零 after[=18 处的值=] 如果该值碰巧被覆盖,程序已完成执行并抛出一个有用的断言。出于这个原因,你得到的堆栈跟踪中只有 JavaScript 位 - 因为检查是由 JavaScript 在 Wasm 堆栈已经退出时完成的。

如果您尝试了一个会导致立即中止的不同操作,例如 assert(false),那么您会按预期在堆栈上看到 WebAssembly and/or C/C++。