在 Chrome DevTools 中调试 WASM

在 Chrome DevTools 中调试 WASM


当我为我的 Scheme 编译器开发 WASM 后端时,我在调试生成的 WASM 代码时遇到了一些棘手的情况。事实证明,Chrome 的 DevTools 中有一个非常强大的 WASM 调试器,因此在这篇简短的文章中我想分享一下如何使用它。

设置和线束

在这篇文章中,我将使用我的 wasm-wat-samples 项目中的一个示例。事实上,gc-print-scheme-pairs 示例中的所有内容都已经就位。此示例展示了如何使用 gc 引用在 WASM 中构造类似方案的 s-exprs 并递归地打印它们。该示例支持嵌套的整数、布尔值和符号对。

要查看实际效果,我们必须首先将 WAT 文件编译为 WASM,例如使用 watgo:

$ cd gc-print-scheme-pairs
$ watgo parse gc-print-scheme-pairs.wat -o gc-print-scheme-pairs.wasm

这 浏览器加载程序.html 该目录中的文件已预期加载
gc-print-scheme-pairs.wasm。但我们不能直接从文件系统打开它;由于它加载 WASM,因此该文件需要由本地 HTTP 服务器提供服务。我个人使用 static-server 来实现此目的,但你可以使用其他任何东西 – 比如 Python 的内置服务器 http服务器:

$ static-server
2026/04/10 08:55:20.244096 Serving directory "." on http://127.0.0.1:8080
...

现在可以通过点击打印的链接并选择在浏览器中打开它 浏览器加载程序.html 文件。

调试过程

打开 Chrome 开发工具,然后在 来源,打开 页 左侧视图。它应该有一个条目 瓦斯姆,这将显示我们模块的反编译 WAT 代码。注意:此代码是从二进制 WASM 反汇编的,因此它会丢失一些 WAT 语法糖(如折叠指令):

在 Chrome DevTools 中调试 WASM

您可以通过点击代码左侧的地址栏来设置断点,然后刷新页面。 DevTools 调试器将再次运行程序并在断点处停止:

显示调试器在断点行停止的屏幕截图

在这里您可以单步执行、进入、查看本地值和调用堆栈等 – 一个真正的调试器!

调试意外异常

在开发编译器时对我来说最重要的用例是调试意外异常(来自诸如 参考投射)。请注意上一个屏幕截图右侧的复选框,其中显示“在…异常时暂停”。选择这些后,DevTools 调试器将在出现异常时自动停止并显示异常的来源。我们来修改一下 gc-打印-方案对.wat 示例以查看其实际效果。这
$emit_value 函数执行一组 参考测试 在转换之前检查它正在处​​理哪种类型的引用;让我们在最开始添加这一行:

(call $emit_bool (ref.cast (ref $Bool) (local.get $v)))

显然这是错误的假设 $v 是一个 bool 引用,无需先对其进行测试;这仅用于演示目的。

不设置任何断点,重新编译此代码 沃特戈 并重新加载页面,我们得到:

显示调试器因异常而停止的屏幕截图

调试器停在导致异常的指令处;此外,在
范围 在右侧窗格中我们可以看到实际类型 $v 是
(参考 $Pair),所以立即清楚发生了什么。

我发现在使用 gc 类型和指令编写(或从编译器发出)重要的 WASM 代码块时,此功能非常有价值。

wasm 中的调试器与 printfs

“我应该使用调试器还是只使用 printfs”是程序员之间争论的一个常见话题。虽然我通常属于“printf 调试”阵营,但我并不教条,并且在情况需要时肯定会使用调试器。

具体来说,在调查 WASM 中的引用异常时,有两个重要因素会导致决定使用调试器:

  1. 总的来说,WASM 的 printf 功能不是很好。我们可以从主机导入类似打印的函数(事实上,我们的示例就是这样做的),但它们不是很灵活,并且在 WASM 中处理字符串通常很痛苦。当使用 gc 类型时,情况会更加复杂,因为这些类型甚至对主机不可见(它们是不透明的引用)。如果我们想要对 gc 值进行 printf 调试,我们必须构建 很多 首先是脚手架。

  2. 一般来说,有了支持性的调试器,异常调试会容易得多。我们的 参考投射 上面的例子可能会发生异常 任何地方 在代码中。想象一下,必须调试一个非常大的 WASM 程序(由编译器发出)才能找到失败的根源
    参考投射;调试器将带您到达现场!

    事实上,即使对于 C 编程,我也总是发现 数据库 对于查明分段错误和类似崩溃的根源最有用。



Source link

Postagens Similares

  • Chrome 137-এ Gemini Nano: AI ইঞ্জিনিয়ারদের জন্য নোট

    শেষ পর্যন্ত, জেমিনি ন্যানো প্রায় সমস্ত ক্রোম ব্যবহারকারীদের জন্য এখানে (আমাকে মূলত ভুল জানানো হয়েছিল যে এটি ক্রোম 138-এ ছিল – কিন্তু আমি আমার নিজের তথ্য পরীক্ষা করেছি এবং ক্রোম 137+ থেকে এটি সীমিত পরিস্থিতিতে ফ্ল্যাগ ছাড়াই পাঠানো শুরু হয়েছে)। আমি এই HN পোস্ট দ্বারা মনে করিয়ে দেওয়া হয়েছে. আমি আশা করি এটি বছরের শেষ…

  • অভ্যাস স্কোরকার্ড: আপনার কোন অভ্যাস পরিবর্তন করা উচিত তা আবিষ্কার করতে এই সাধারণ অনুশীলনটি ব্যবহার করুন

    এই নিবন্ধটি পারমাণবিক অভ্যাস থেকে একটি উদ্ধৃতি, আমার নিউ ইয়র্ক টাইমস বেস্ট সেলিং বই। জাপানের রেল ব্যবস্থাকে বিশ্বের অন্যতম সেরা হিসেবে গণ্য করা হয়। আপনি যদি কখনও নিজেকে টোকিওতে একটি ট্রেনে চড়তে দেখেন, আপনি লক্ষ্য করবেন যে কন্ডাক্টরদের একটি অদ্ভুত অভ্যাস রয়েছে। যেহেতু প্রতিটি অপারেটর ট্রেন চালায়, তারা বিভিন্ন বস্তুর দিকে নির্দেশ করে এবং আদেশ…

  • Erhöhter Arbeiterdruck von AI

    Mein jüngster deprimierender Gedanke über KI ist, dass mit dem Druck, KI zu übernehmen und Mitarbeiter durch Automatisierung zu ersetzen, die gelebte Erfahrung vieler/die meisten übrig Die Mitarbeiter werden wahrscheinlich weitaus weitaus schlechter. Ich stelle mir eine ganze Menge überwältigender Manager vor, die unangemessene Anforderungen stellen und selbst den Vorwand der Fürsorge verzichten. Späte Stunden,…

  • 私の Jekyll サイトに CDN フロントエンドを与える

    📅 2025 年 11 月 14 日 | ⏱️ 約 5 分で読めます .htaccess リダイレクトを維持しながら、Jekyll ベースのサイトを Bunny CDN の背後で動作させることができました。私がやった方法は次のとおりです… 最近 Jekyll に戻って以来、私はこのサイトを Ionos がホストする VPS で実行し、小さなデプロイ スクリプトを使用してサイトを構築し、rsync を実行しています。 これはすべてうまくいきましたが、私は実際には、いくつかの画像とカスタム フォントをホストするだけではなく、Bunny CDN を使用したいと考えていました。静的サイトなので、すべてをストレージ プラットフォームにダンプすることもできましたが、1 つのサイトに数トンのリダイレクトがあります。 .htaccess 長年にわたるさまざまなプラットフォームの移行によるファイル。 Bunny’s Edge Platform でもこれらを処理できたかもしれませんが、リダイレクトの数を考えれば、維持するのは大変だったでしょう。そこで私は、自分の Jekyll サイトの前に Bunny を簡単に置くことは決してできないだろうと考えて、仕事に取り掛かりました。 💡 その時、私はひらめきました。 を使用してバニープルゾーンを作成したらどうなるでしょうか kevquirk.com パブリック ドメインとして使用し、VPS 上に別のドメインを設定し、そこでサイトをホストし、それをプル ゾーンのオリジンとして使用しますか? 私の理論では、Bunny は依然として VPS からコンテンツをリクエストしているだろうということでした。…

  • 缩放、拉伸和移动正弦曲线

    2026 年 5 月 2 日 07:17 标签 数学 这是关于如何调整标准正弦波以改变其幅度、频率和相移的简要说明。更准确地说,给出一般函数: 我们将看看如何调整参数 , 和 影响形状。下面的每个部分都从数学角度涵盖了这些方面之一,您可以使用底部的演示来直观地试验该主题。 缩放 从概念上来说,缩放是最简单的改变。我们调整 增加或减少 的幅度(最大高度)。设置将使 值是原始函数的两倍(正方向和负方向)。 伸展运动 拉伸会改变 的频率,与其周期成反比。基线函数的周期为 ,这意味着它每隔 重复一次。换句话说,对于任何 。 如果我们设置,我们就会得到。该函数的重复速度是 的两倍,因为 在送入正弦曲线之前乘以 2。如果 变化 ,正弦曲线的输入变化 。因此, is 的周期、 is 的周期等等。 更一般地, 的周期是 。玩下面的演示,通过更改来查看其实际效果 并观察波形如何变化。 如果我们知道我们想要的周期,我们可以很容易地计算出 这给了我们这个时期: 变速 我们讨论的最后一个参数是 ;它被称为 阶段 的正弦曲线。在基线中, 。正弦波在 处为 0,在 处达到其正峰值,在 处再次穿过 0,在 处达到负峰值,并返回到重复开始处的原始位置。 通过添加一个非零…

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *