Emscripten 如何调试wasm
时间: 2023-11-04 11:04:49 浏览: 130
Emscripten 提供了多种调试 wasm 的方式,以下是其中几种常用的方法:
1. 使用 Emscripten 提供的 emrun 工具进行调试,emrun 工具可以在浏览器中启动 wasm 应用程序,并提供浏览器的开发者工具进行调试。
2. 使用 Chrome 浏览器的开发者工具进行调试,Chrome 浏览器支持通过 WebAssembly Debugger Extension 进行 wasm 的调试。
3. 使用 Visual Studio Code 进行调试,Emscripten 提供了一个 Visual Studio Code 插件,可以在 Visual Studio Code 中进行 wasm 的调试。
4. 使用 LLVM 的 lldb 进行调试,Emscripten 使用 LLVM 作为编译器,因此可以使用 lldb 进行调试。首先需要将 wasm 编译成 LLVM bitcode 格式,然后使用 lldb 进行调试。
以上是一些常见的调试 wasm 的方法,具体使用方法可以参考 Emscripten 的官方文档。
相关问题
下面是我 运行终端代码后的返回,请帮我解释下:shenhaibo@bogon webAssembly % emcc add.c -s WASM=1 -o add.wasm wasm-ld: error: /opt/homebrew/Cellar/emscripten/3.1.40/libexec/cache/sysroot/lib/wasm32-emscripten/libstandalonewasm-nocatch.a(__main_void.o): undefined symbol: main emcc: error: '/opt/homebrew/Cellar/emscripten/3.1.40/libexec/llvm/bin/wasm-ld -o add.wasm /var/folders/hd/zkctfvz128366gcjfw9pgslr0000gn/T/emscripten_temp_0gmz58hs/add_0.o -L/opt/homebrew/Cellar/emscripten/3.1.40/libexec/cache/sysroot/lib/wasm32-emscripten /opt/homebrew/Cellar/emscripten/3.1.40/libexec/cache/sysroot/lib/wasm32-emscripten/crt1.o -lGL -lal -lhtml5 -lstandalonewasm-nocatch -lstubs-debug -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-debug-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr /var/folders/hd/zkctfvz128366gcjfw9pgslr0000gn/T/tmp6m8wb6r0libemscripten_js_symbols.so --strip-debug --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_get_current --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__errno_location --export-table -z stack-size=65536 --initial-memory=16777216 --max-memory=16777216 --stack-first' failed (returned 1) shenhaibo@bogon webAssembly %
这个错误提示是在链接阶段出现的。根据错误提示可以看出是在链接 `add_0.o` 文件时出现了错误,错误原因是在静态库 `libstandalonewasm-nocatch.a` 的 `__main_void.o` 文件中找不到 `main` 函数的定义。
这个问题可能是由于在编译时没有指定入口函数(main 函数)的原因导致的。在 C 语言中,程序的入口函数是 main 函数,因此在编译时需要指定 main 函数的定义。你可以检查一下你的源代码中是否包含了 main 函数的定义,如果没有的话,可以添加一个 main 函数。同时,你可以在编译时添加 `-s MAIN_MODULE=1` 选项来指定入口模块。
另外,还有一种可能是你使用了 Emscripten 特有的 API,但是没有链接对应的库文件,这时需要添加对应的库文件来解决问题。
cmake编译通过EMSCRIPTEN_BINDINGS导出c函数的WebAssembly项目生成.js与.wasm文件,使用cmake3.0与c++11
首先,确保你的项目已经正确地链接了 Emscripten SDK。接下来,在 CMakeLists.txt 中添加以下内容:
```cmake
cmake_minimum_required(VERSION 3.0)
project(your_project)
# 设置编译选项
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# 添加 Emscripten 编译器
SET(CMAKE_C_COMPILER "emcc")
SET(CMAKE_CXX_COMPILER "em++")
# 添加 Emscripten 编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1 -s USE_SDL=2 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3")
# 添加源代码
add_executable(your_project main.cpp)
# 导出 C 函数为 JavaScript 模块
set_target_properties(your_project PROPERTIES LINK_FLAGS "-s EXPORTED_FUNCTIONS='[\"_your_c_function\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'")
# 指定输出文件名
set_target_properties(your_project PROPERTIES OUTPUT_NAME "your_project")
# 指定输出文件类型为 JavaScript 模块
set_target_properties(your_project PROPERTIES SUFFIX ".js")
# 拷贝输出文件到指定目录
add_custom_command(TARGET your_project POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:your_project> ${CMAKE_CURRENT_SOURCE_DIR}/output/)
```
以上代码做了以下几件事:
1. 设置编译选项,包括编译标准、编译器等等。
2. 添加 Emscripten 编译器和编译选项。
3. 添加源代码。
4. 导出 C 函数为 JavaScript 模块,这里的 `_your_c_function` 是你需要导出的函数名。
5. 指定输出文件名为 `your_project.js`。
6. 拷贝输出文件到指定目录。
最后,你可以通过以下命令来生成 WebAssembly 项目:
```bash
mkdir build && cd build
cmake ..
make
```
如果一切顺利,你将得到 `your_project.js` 和 `your_project.wasm` 两个文件,其中前者是 JavaScript 模块,后者是 WebAssembly 模块。
阅读全文