各位同学,早上好!或者晚上好!取决于你们在哪儿,以及什么时候看的这段文字。 今天咱们来聊聊一个有点“高冷”,但又非常重要的东西:WebAssembly的调试信息,也就是DWARF,以及它如何与调试器“眉来眼去”。 放心,我会尽量用大白话,把这个技术啃下来。
开场:WebAssembly的“灵魂”
WebAssembly,简称Wasm,是一种为现代Web应用设计的新型二进制指令格式。它的目标是提供接近原生的性能,并且安全、高效。 但是,如果我们写了一堆Wasm代码,结果发现跑起来不对劲,怎么办? 总不能对着一堆十六进制的机器码抓瞎吧? 这时候,调试信息就派上用场了。 调试信息,就像是程序的“灵魂”,它告诉调试器:
- 源代码和Wasm代码之间的对应关系。
- 变量的名称、类型和存储位置。
- 函数的名称、参数和局部变量。
- 代码的行号和文件信息。
有了这些信息,我们就可以像调试普通代码一样,单步执行Wasm代码,查看变量的值,设置断点等等。
主角登场:DWARF (Debugging With Attributed Record Formats)
DWARF,是一种广泛使用的调试信息格式。它最初是为Unix系统设计的,但现在已经被各种平台和编程语言所采用,包括WebAssembly。 DWARF并不是一种特定的数据格式,而是一系列标准的集合,定义了如何描述程序的调试信息。
DWARF的核心概念:
- 编译单元 (Compilation Unit, CU): 代表一个源文件(例如C/C++/Rust文件)编译后的结果。每个CU包含该源文件中定义的函数、变量、类型等信息。
- 调试信息条目 (Debugging Information Entry, DIE): DWARF使用树状结构来组织调试信息。每个节点都是一个DIE,表示一个程序实体(例如函数、变量、类型)。
- 属性 (Attribute): 每个DIE都有一些属性,用来描述该程序实体的特性。例如,一个函数DIE可能有
DW_AT_name
属性表示函数名,DW_AT_low_pc
和DW_AT_high_pc
属性表示函数在内存中的起始和结束地址。 - 位置表达式 (Location Expression): 用来描述变量或表达式的值在内存中的位置。例如,一个局部变量可能存储在栈上的某个位置,或者存储在寄存器中。
DWARF在WebAssembly中的应用:
WebAssembly工具链(例如Emscripten、Rust的wasm-pack)可以生成包含DWARF调试信息的Wasm模块。 这些调试信息通常被嵌入到Wasm模块的自定义段中。 调试器(例如Chrome DevTools、Firefox Developer Tools)可以读取这些调试信息,并将其用于调试Wasm代码。
DWARF数据结构浅析:
为了更好地理解DWARF,我们来看一些关键的数据结构。 请注意,这些只是简化的例子,实际的DWARF格式要复杂得多。
| 数据结构 | 描述 | 例子 |
| ———– | ——————————————————————————————————————————————————————————————————————————- | ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————0116.15593465.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.1567916993691416330115.15679169936