在 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

  • 永続的なアンダークラスだけが、それが永続的であると信じている人々です

    ここしばらくの間、AI の誕生によって世代間の富を逃すという「絞首台のユーモア」ミームが根強く存在しています。 API エコノミーの光と影について書いてきた者として、これはテクノロジーによって生み出された再発明されたクラス システムと明らかに類似点があるトピックです。これを信じるための非常に現実的なデータポイントがいくつかあると思います。 Meta FAIR の研究者は年間 50 万ドルを稼いでいますが、Meta SuperIntelligence Labs の研究者は年間 2,500 万ドル以上を稼いでいます 資本主義、特に AI では大きいものはさらに大きくなる傾向があります OpenAIが従業員全員に150万ドルのボーナスを与え、従業員に60億ドルの二次販売を提供するなど、大規模な研究所の評価額が大幅に上昇した一方で、アンスロピック社の評価額は40億ドルから2年間で1,830億ドルに上昇し、ほとんどの従業員はサンフランシスコのオフィスで働くことが予想されているため、サンフランシスコの不動産価格は異常な高騰を引き起こし、土地の所有者と決して所有者になれない借主との間の富の格差が大幅に拡大するはずだ。永久の下層階級。 私は、コーディング エージェントを効果的に最大限に活用できるプログラマーと、懐疑的であり、その懐疑を克服するための個人的な「なるほど」の瞬間が決して得られないようなスキルの問題を抱えているプログラマーとの間に、別の、より小規模なアンダークラスが出現していると思います。なぜなら、ほとんどの優れたエージェント プログラマーの生産性は (最終的には! 今年は無理かもしれません!) ほとんどの Trad プログラマーの生産性をはるかに上回るからです。仕事は、エージェントティック コーディングのラインより上に住む、素晴らしく裕福で楽しい小さなチームと、それよりも下に住む、平凡で人生を嫌う、Jira チケットのロギングを行う大企業の仕事の間で分岐します。 そうです、私はアンダークラスが存在し、格差が拡大することを否定しません。テクノロジーと資本主義の歴史全体がこれを教えてくれており、それが逆転すると期待する理由はありません。ここでバブルを破ってしまったらごめんなさい。 私の問題は、人々が運命論的に冗談を言い、多くの人が密かに皮肉にもそうなると信じていることです。 永続。 いいえ、これは非常に低レベルな考え方です。 あなたはアンダークラスから逃れられる年齢ではありません。 不平等はさておき、 AI はクラスの固定化ではなく流動性も高める。大分類は時間の経過とともに改善されており、減少するものではありません。を除外する – 大分類は、IQ ではなく、あなたの代理店レベルで最もよく行われるようになります。。 これらはすべて客観的に真実であり、日々真実性が高まっています。 人々はこれまでよりも早く英語を学ぶことができるようになりました。 人々は今までよりも早くコーディングを学ぶことができるようになりました。 人々はこれまでよりも早く ML/AI エンジニアリングを学ぶことができるようになりました。 リモートで仕事をしたり、完全にオンラインでビジネスを運営したりすることがこれまでより簡単になりました。 Stripe Atlas/YC により、これまでよりも簡単にスタートアップを開始できるようになりました。 新しい AI モデルとビジネス モデルにより、新興スタートアップ企業は、より速いサイクルで収益を 0…

  • எனது சிறந்த துணை £100 கொள்முதல்

    20 ஏப்ரல் 2026 நான் சமீபத்தில் தி ஐடியா ரோஸ்டரியின் தனிப்பட்ட வாழ்க்கை கேம்சேஞ்சர்களைப் பற்றிய ஒரு அத்தியாயத்தைக் கேட்டுக்கொண்டிருந்தேன், அத்தியாயத்தின் முடிவில், ஹெர்மன் ஜேசனிடம் கேட்டார்: நீங்கள் இதுவரை £100க்கு குறைவாக வாங்கிய சிறந்த கொள்முதல் எது? ஜேசன் ஒரு முட்டை வேட்டையாடுபவர், ஹெர்மனுக்கு அது ஒரு காபி கிரைண்டர். இந்த விவாதம் என்னுடையது என்ன என்பதைப் பற்றி சிந்திக்க வைத்தது, முதலில் எனக்கு உறுதியாக தெரியவில்லை. ஆனால் சிறிது யோசனைக்குப் பிறகு அது என்னைத்…

  • Flickr 的 URL 方案-無名之輩

    我在 URL 作為使用者介面方面接受的教育有一半來自 2000 年代末的 Flickr。它的 URL 如下圖所示: flickr.com/photos/mwichary/favoritesflickr.com/photos/mwichary/setsflickr.com/photos/mwichary/sets/72177720330077904flickr.com/photos/mwichary/54896695834flickr.com/photos/mwichary/54896695834/in/set-72177720330077904 這真是令人難以置信,令人呼吸新鮮空氣。沒有多餘的 www. 在前面或尷尬 .php 在最後。沒有參數與其令人不愉快 ?&= 句法。不 % 用十六進位代碼進行聚會的標誌。當您與其他人共用這些 URL 時,您無需修改或刪除任何內容。當 Chrome 的網址列開始自動完成它們時,您就清楚地知道自己要去哪裡。 這可能看起來很愚蠢。這 使用者介面 網址數量?誰手動輸入或編輯 URL?但鍵盤仍然是最有效的輸入裝置。如果您要去的地方是您已經去過的地方,那麼輸入幾個字母可能比等待頁面加載、單擊等更快地到達目的地。它可能比篩選書籤更快到達那裡。或者,如果您要去的位置在層次結構中位於上層,則精心設計的 URL 將允許您拖曳以進行選擇,然後從末尾退格一些內容。 Flickr 允許完成這一切,而且無需按 Shift 鍵。 任何易於編輯的 URL 都需要輕鬆編輯 可讀的, 也。 Flickr 是。連結名稱非常簡單,以至於看到菜單… …準確地告訴您每個項目的 URL 是什麼。 此後的幾年裡,富文本的夢想並沒有實現。我們繼續在各地看到和使用裸 URL。這就是 Flickr URL 的另一個好處:它們很短。它們可以放在電子郵件或 Markdown 中。從頭開始,它們可以被放置在 句子。 今天,它們在 Slack 上永遠不會被中間那個令人沮喪的省略號截斷(這偶爾會導致有人複製縮短且格式錯誤的 URL 並進一步共享!)。…

  • Temel dönemin en etkili kitabını güncelleme

    Bir bakıma, bu iki kitap tüm profesyonel kariyerimden sorumludur. Erken bilgisayarlarla, süslü bir schmancy masaüstüne veya parmağınızla kolayca dürtebileceğiniz ve üretebileceğiniz uygulamalarla dolu bir ekrana önyüklemediniz. HAYIR, Bu bilgisayarlar komut satırına kadar önyüklendi. Buradan, şanslıysanız, bir kaset bant sürücünüz olabilir. Doğru komutları biliyorsanız, bunları kaset kasetinden program yüklemek için yazabilirsiniz. Ancak bu, erken kişisel bilgisayarlarla…

  • html సమీక్ష 05

    15 కొత్త ప్రయోగాత్మక వెబ్ కవిత్వం మరియు కళలు, మిల్క్ ఫిష్, బ్యానర్ హైవే మరియు కర్సర్ పార్క్ # నాకు ఇష్టమైనవి Source link

  • Ментон Ріс – Переоцінка Twitter/X API

    Місяць тому я вголос задавався питанням, чи настав час додати перехресні публікації з Twitter до Micro.blog. Після довгих роздумів і відгуків користувачів я вважаю, що так. Мета завжди полягала в тому, щоб допомогти людям спочатку публікувати публікації на їхньому власному домені, незалежно від того, де вони також вирішили поділитися своїми публікаціями. Хоча я сподівався, що…

Deixe um comentário

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