gpt4 book ai didi

safari - 如何找到safari中不断刷新页面的原因?

转载 作者:行者123 更新时间:2023-12-01 15:23:29 26 4
gpt4 key购买 nike

我试图找出过去一个月左右出现的客户端网站上的问题,因为 iOS 和 OSX 的最新更新。当 Mac 或 iOS Safari 用户通过 EDM 中的链接被定向到站点中的任何页面时,他们会陷入不断刷新页面的循环中。它似乎也在刷新之间泄漏内存,因为事件监视器显示该站点的 Safari Web 内容进程的内存使用量迅速增长(在我杀死它之前两分钟左右达到 4 GB)。

该问题只能在 Safari 浏览器上重现。 Mac 上的 Chrome 似乎不受影响。适用于 Windows 的 Safari 显示刷新问题,但似乎没有开始囤积内存,尽管 WebKit2WebProcess.ee 进程的 CPU 使用率一直处于相当高的值,直到窗口关闭。我尝试将添加到 EDM 链接的 utm_* 参数一一删除,直到我可以确认问题是由 utm_source 本身引起的,然后发现我应该预料到这一点,因为它显然是 GA 寻找的主要标签。更有趣的是,删除 GA 并没有解决问题 - 我注释掉了创建脚本标签的代码(就其值(value)而言,使用的脚本不是正常的 www.google-analytics.com/ga.js 而是来自 stats.g.doubleclick.net/dc.js 的 DFP 广告管理系统)。

解决问题的是不加载 GPT - 注释以下代码:

var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
(function() {
var gads = document.createElement("script");
gads.async = true;
gads.type = "text/javascript";
var useSSL = "https:" == document.location.protocol;
gads.src = (useSSL ? "https:" : "http:") + "//www.googletagservices.com/tag/js/gpt.js";
var node =document.getElementsByTagName("script")[0];
node.parentNode.insertBefore(gads, node);
})();

所以我相当确定 GPT 正在检测 utm_source 参数并试图做...某事...在 Safari 上失败...一些原因...不幸的是 GPT 代码被混淆了,我不太可能找到我的只是阅读它的问题,所以我希望可能有一些方法可以在我不知道的 Safari 开发人员控制台中刷新页面之前获取调用堆栈,或者其他一些我没有想到的调试技术。也许其他人甚至遇到过这个问题?

据我所知,唯一关心这些参数的脚本是 Google Analytics,所以我也很乐意听到我正沿着花园小径前进。

编辑:我尝试取消注释 GPT 脚本标签,然后评论页面上我们向其推送命令的一个地方(使用 googletag.cmd.push() )以防我们对它的使用导致问题(我们基本上只是定义然后发布 8 个插槽在推送的 cmd 中,然后启用广告服务)。评论此命令并没有解决问题,它似乎与加载 GPT 有关。

最佳答案

所以这在所有方面都是一个令人难以置信的令人困惑的问题,即使在我修复它之后仍然如此。

我们能够通过更新网站上正在使用的 History.js 库来解决这个问题,就其本身而言,我完全可以接受作为有效的故障排除步骤(因此我尝试了它)。然而,我对 History.js 和 gpt.js 将如何相互交互感到非常困惑。导致问题仅在以下情况下发生:

使用 Safari
使用旧版本的 History.js
使用 GPT(应该对 History.js 没有影响)
使用 utm_source 标签(它应该对 History.js 或 GPT 没有影响)

但比起普遍存在的问题,我更高兴被固定问题所迷惑,所以我将把它放在“太难”的篮子里。

顺便说一句,我的主要问题是做,而不是问题,所以这是我如何解决结论的问题,以防它对其他人有帮助:

  • 我在 <head> 的顶部添加了一个脚本标签它为 beforeunload 注册了一个事件处理程序,调用调试器语句。这将使我有时间在页面刷新之前实际检查时间线和分析器。
  • 这告诉我,在 beforeunload 事件之前,调用了一个 popstate 事件(事后我责备自己在看到 popstate 时没有直接进入 History.js)。这个事件安装了一个计时器,我注意到它被立即触发,然后每 1000 毫秒触发一次。这是在 beforeunload 事件之前在 popstate 事件中触发的最后一件事,所以我认为它很有可能导致刷新。
  • 接下来,我花了一些时间对 safari 没有在它的时间线中公开事件调用堆栈这一事实进行梳理。我知道如何在 Chrome 中解决这个问题,但我无法在 Chrome 中解决这个问题。我所要做的就是定时器 ID。最终我像这样覆盖了 setTimeout :

    var origST = window.setTimeout;
    window.timers = [];
    window.setTimeout = function(f,t) {
    window.timers[origST(f,t)] = window.setTimeout.caller ? window.setTimeout.caller : 'Global Scope';
    }
  • 对 setInterval 也做了同样的事情。然后我可以重新加载页面,获取计时器的 ID,然后在控制台中检查 timers[the id]对于已安装计时器的函数的文本。
  • 接下来我需要在所有加载的脚本文件中搜索有问题的函数定义(它是一个混淆和丑化的脚本,不是我可以轻易猜到的)我不确定这在 Safari 中是否真的可行,如果是的话我可以不知道怎么做。幸运的是,这并不依赖于重现问题,所以我加载了 Chrome 并使用它的开发工具来搜索脚本文件。
  • 在 History.js 中找到该函数,我们对其进行了更新并发现问题已解决。
  • 关于safari - 如何找到safari中不断刷新页面的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27810283/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com