如何获取 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++。
我正在寻找 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++。