Golang中Chrome在Windows上刷新4次后无法加载wasm代码的问题

Golang中Chrome在Windows上刷新4次后无法加载wasm代码的问题 chrome_wasm_crash

我正在通过这个页面学习wasm。

Firefox和Edge(使用Polyfill)都没有问题。

有没有解决方案?或者我能否知道是什么错误导致了这个问题?


更多关于Golang中Chrome在Windows上刷新4次后无法加载wasm代码的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

没有人遇到过这种情况吗?

更多关于Golang中Chrome在Windows上刷新4次后无法加载wasm代码的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Windows Chrome浏览器中频繁切换页面后,我遇到了类似的问题,而且数量并不固定。

2018年12月18日更新:在版本71.0.3578.98上几乎不再崩溃,但仍有少数情况会出现崩溃。

或许问题已经得到解决。

我修改了话题 😄

希望这也引起了他们的注意。

感谢您抽出时间分享。

嗨 Johan,

非常感谢你在 macOS 上进行了尝试!

我也在安卓平板上测试了计算器示例,使用 Firefox Beta(版本 63)和 Chrome 都能正常运行。有人有 iPhone 或 iPad 可以测试吗?

是的,你说得对。 我还修改了标题。

期待你的应用。

感谢你抽出时间。图片

你好 Robert,

我刚从你链接的 GitHub 仓库获取了 Calc 的源代码。在清除了浏览器缓存之后,这个方法对我也有效。

在视频中,我没有看出你操作上有任何问题,但我不太习惯在 Windows 上进行 Go/WebAssembly 开发,而且我也看不懂韩文。

遗憾的是,我首篇文章中的示例在Windows Chrome浏览器中仍显示Aw, Snap!错误,且未开启开发者工具。 我已通过个人网站run按钮上传了该示例。

感谢您抽出时间。

电影中00:17处显示Chrome浏览器崩溃了。 错误信息与我第一篇帖子中的图片相同。

虽然计算器示例不在上面的影片中,但遇到了相同的情况。 抱歉让您感到困惑。

我几小时后会重新录制影片。 需要休息了。

感谢您抽出时间。

在 macOS 系统上加载 http://jayts.com/wasm-example-calc/

  • Chrome 70 无论是否开启开发者工具都能正常工作。每种情况下都重新加载了约8次
  • Firefox 62.0.3 工作正常。尝试了开启和关闭开发者工具两种情况
  • Safari 12.0 工作正常。尝试了开启和关闭开发者工具两种情况

你好Robert,

我试过了,对我来说是有效的。我使用的是Linux系统,搭配Firefox 62.0.3和Chrome 70.0.3538.67浏览器。你是在点击浏览器窗口后程序崩溃了吗?我就是这样测试的,没有发现任何问题。

需要注意的一点是,Chrome(可能还有Firefox)可能会从缓存中加载页面,而不是从服务器加载。或者可能在加载新版本应用时保留了旧版本的残留文件。

所以如果你遇到奇怪的问题,请按照以下步骤完全清除浏览器缓存:

  1. 打开一个空白标签页
  2. 关闭WebAssembly应用标签页
  3. 清除浏览器缓存
  4. 关闭浏览器

然后重新打开浏览器访问WebAssembly应用,这样就会从网络服务器完全重新加载它。

我重新制作了视频。

尝试来自 golang wiki 的示例 - https://github.com/golang/go/wiki/WebAssembly

Chrome show crash with golang wasm

尝试计算器示例 - https://github.com/Piszmog/go-wasm-example

Chrome show crash with golang wasm other


从这两个视频中,你可以看到在 Chrome 中点击按钮或刷新时出现的崩溃画面。

很抱歉,我没有在测试中包含"run"示例。我错误地认为处理更复杂的示例就足够了。(只是我的时间有限。)

我在Linux上尝试了"run"示例,它在Chrome、Firefox和Opera上都能正常工作。但在Windows上,正如你报告的那样,我看到了"Aw, Snap!"错误,还有"内存不足"错误——这是在开发者工具窗口关闭的情况下,通过点击运行按钮(不仅仅是浏览器的重新加载按钮)时出现的。事实上,它甚至让Chrome崩溃了!(所以也许你可以把话题改回原来的。)我注意到每点击四次运行按钮,就会发生一次错误。

在Opera上我也遇到了"内存不足"错误,同样是通过点击应用程序的运行按钮四次。

当Chrome崩溃时,会弹出一个对话框让我提交错误报告,我也确实提交了。(提交了两次,因为后来又崩溃了一次。)希望这能引起他们的注意。

我注意到这个话题目前已有超过140次查看,所以我把这个计算器WebAssembly/Go示例放到了我的网站上。如果你想尝试运行,请访问:

http://jayts.com/wasm-example-calc/

这只是一个非常简单的"计算器"示例,用于显示两个整数的和或差(不支持浮点数)。在顶部的文本框中输入整数,然后点击加法或减法按钮,就能在下方文本框中看到结果。

要检查bug,请打开浏览器的开发者工具,然后多次点击浏览器的刷新按钮。如果你看到失败情况,请告诉我们。

我特别希望听到macOS/Safari用户的反馈。在macOS上,这个计算器应用是否能在Safari、Firefox、Chrome和Opera中正常运行?你能否在Chrome和/或Opera中复现这个失败情况?

我正在开发一个更复杂的Go WebAssembly应用,这将是一个更好的测试,也会更有趣。但目前,如果能收到论坛成员关于Go对WebAssembly的支持在各种平台上的表现报告,那将非常棒。

你好 jayts,

你做了和我一样的事情。

哎呀,抱歉忘记说明我使用的操作系统了。

以下是我的工作环境:

  • CPU: AMD Ryzen 2700
  • 内存: 32G
  • 操作系统: MS-Windows 10 专业版
  • Chrome: 70.0.3538.67 (几小时前更新)
  • Firefox: 开发者版 64.0b2 (最新版)

我按照你的提示清除了浏览器缓存,然后再次尝试,得到了相同的结果。

这似乎与其他 wasm 示例(例如这个)显示的情况类似。 这个计算器示例看起来运行良好,但在点击 addsubtract 按钮后,刷新当前页面3次也会崩溃。

我为此上传了一个视频。

Crash with golang and google chrome on MS-Windows 10 pro

00:26 之前是我之前询问的情况。 00:26 之后是使用 syscall/js 时的情况。

我很困惑该向 Go 还是 Chrome 询问或报告这个问题。

感谢你抽出时间。

非常感谢上传新视频,这对我帮助很大。我仅使用了计算器示例,并成功复现了该问题。

该应用在Linux系统上仍能正常运行,但我在Windows 7系统上进行了测试,使用的浏览器包括Firefox 62.0.3版、Chrome 70.0.3538.67版和Opera 56.0.3051.52版(均为最新更新)。在基于Chromium内核的Chrome和Opera浏览器中,我遇到了与您报告相同的问题,而Firefox运行该应用则毫无问题。

我观察到的现象与您展示的问题产生方式略有不同。

首先,我发现只有在开发者工具窗口打开时才会出现此问题。这让我感到欣慰,因为这意味着部署WebAssembly应用实际上不存在问题(据我所知),普通网页访问者不会受到影响。

其次,我不需要在重新加载前点击按钮。只需多次点击浏览器的重新加载按钮就会触发错误,对我而言这就足够了。触发错误的点击次数并不固定,有时是4次,有时是其他次数。

顺便说明,Chrome或Opera并未崩溃,只是它们无法加载WebAssembly应用。在Chrome中,我同时看到了视频中显示的"糟糕,崩溃了!"和"内存不足"错误。在Opera中,我只看到"内存不足"错误。而且出现故障后,再次点击重新加载即可解决问题。因此即便出现问题,也并非十分严重。

为了进一步调查,我尝试在Linux系统上使用Apache 2提供服务,同时为本地Linux系统和局域网内的Windows 7系统提供应用。在这种配置下,运行在Linux和Windows上的浏览器都从同一服务器获取应用(完全相同的文件)。

测试结果表明,Linux系统上的所有三款浏览器都能正常运行计算器示例应用,而在Windows系统上,Chrome和Opera都存在这个错误,Firefox则表现正常。

这看起来像是Chromium代码库中出现的错误,并且至今仍存在于Opera和Chrome浏览器中。

我建议目前您可以先使用Firefox开发者工具来开发WebAssembly应用,如果愿意的话,也可以向Chrome和Chromium开发者报告这个错误。

这是一个已知的 Chrome 浏览器在 Windows 平台上运行 WebAssembly 时的内存管理问题。当页面刷新多次后,Chrome 未能正确释放之前加载的 wasm 模块内存,导致后续加载失败。

问题核心在于 Chrome 的垃圾回收机制与 wasm 实例生命周期管理存在冲突。每次刷新页面时,之前的 wasm 实例没有被完全清理,积累到一定次数后就会触发内存限制或资源耗尽。

以下是几种可行的解决方案:

方案1:手动清理 wasm 实例 在页面卸载前主动清理 wasm 相关资源:

// 在Go代码中添加清理逻辑
func main() {
    // 你的wasm应用逻辑
    println("WASM应用启动")
    
    // 注册清理函数
    js.Global().Set("cleanupWasm", js.FuncOf(cleanup))
}

func cleanup(this js.Value, args []js.Value) interface{} {
    // 清理wasm相关资源
    // 例如关闭连接、释放内存等
    return nil
}

在HTML中添加页面卸载监听:

window.addEventListener('beforeunload', function() {
    if (typeof cleanupWasm === 'function') {
        cleanupWasm();
    }
});

方案2:使用 Service Worker 缓存控制 通过Service Worker控制wasm资源的缓存策略:

// sw.js
self.addEventListener('fetch', (event) => {
    if (event.request.url.includes('.wasm')) {
        event.respondWith(
            caches.open('wasm-cache').then((cache) => {
                return fetch(event.request).then((response) => {
                    cache.put(event.request, response.clone());
                    return response;
                }).catch(() => cache.match(event.request));
            })
        );
    }
});

方案3:强制刷新缓存 在开发阶段,可以通过禁用缓存或添加版本号来避免问题:

<script>
    // 添加时间戳强制刷新
    fetch('main.wasm?v=' + Date.now())
        .then(response => response.arrayBuffer())
        .then(bytes => WebAssembly.instantiate(bytes, go.importObject))
        .then(result => {
            go.run(result.instance);
        });
</script>

方案4:使用最新的Chrome版本 这个问题在较新的Chrome版本中有所改善,确保使用Chrome 89或更高版本。

目前最稳定的解决方案是方案1,通过主动管理wasm实例的生命周期来避免内存泄漏。如果问题持续存在,建议在Chrome的issue跟踪器中报告具体的内存使用情况。

回到顶部