JS `WebAssembly` `Debug Info` (`DWARF`) 与调试器集成

各位同学,早上好!或者晚上好!取决于你们在哪儿,以及什么时候看的这段文字。 今天咱们来聊聊一个有点“高冷”,但又非常重要的东西:WebAssembly的调试信息,也就是DWARF,以及它如何与调试器“眉来眼去”。 放心,我会尽量用大白话,把这个技术啃下来。

开场:WebAssembly的“灵魂”

WebAssembly,简称Wasm,是一种为现代Web应用设计的新型二进制指令格式。它的目标是提供接近原生的性能,并且安全、高效。 但是,如果我们写了一堆Wasm代码,结果发现跑起来不对劲,怎么办? 总不能对着一堆十六进制的机器码抓瞎吧? 这时候,调试信息就派上用场了。 调试信息,就像是程序的“灵魂”,它告诉调试器:

  • 源代码和Wasm代码之间的对应关系。
  • 变量的名称、类型和存储位置。
  • 函数的名称、参数和局部变量。
  • 代码的行号和文件信息。

有了这些信息,我们就可以像调试普通代码一样,单步执行Wasm代码,查看变量的值,设置断点等等。

主角登场:DWARF (Debugging With Attributed Record Formats)

DWARF,是一种广泛使用的调试信息格式。它最初是为Unix系统设计的,但现在已经被各种平台和编程语言所采用,包括WebAssembly。 DWARF并不是一种特定的数据格式,而是一系列标准的集合,定义了如何描述程序的调试信息。

DWARF的核心概念:

  1. 编译单元 (Compilation Unit, CU): 代表一个源文件(例如C/C++/Rust文件)编译后的结果。每个CU包含该源文件中定义的函数、变量、类型等信息。
  2. 调试信息条目 (Debugging Information Entry, DIE): DWARF使用树状结构来组织调试信息。每个节点都是一个DIE,表示一个程序实体(例如函数、变量、类型)。
  3. 属性 (Attribute): 每个DIE都有一些属性,用来描述该程序实体的特性。例如,一个函数DIE可能有DW_AT_name属性表示函数名,DW_AT_low_pcDW_AT_high_pc属性表示函数在内存中的起始和结束地址。
  4. 位置表达式 (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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注