Sentry-javascript: 旧浏览器导致 [object Event] 被记录

创建于 2015-08-03  ·  50评论  ·  资料来源: getsentry/sentry-javascript

正如Stack Overflow 上的这个线程中所描述的,发送到window.onerror的某些事件将导致[object Event]被记录为消息,而不是其他的。 如果 Sentry 能够检测到这些古老的Event对象并从中挖掘出一些细节,那么记录到 Sentry 的内容是我们可以采取行动并尝试修复的可理解的东西,那就太好了。

最有用的评论

@rollokb – 有这方面的消息吗?

所有50条评论

我们日志中的一个特定样本显示了以下信息:

  • 浏览器:海豚3.0
  • 设备:三星 GT-S8600
  • 操作系统:八达2.0

我可以验证从 Android 4.1 到 4.4 的 Android 浏览器,似乎来自第 3 方 Android 手机(例如三星、HTC)的 Android 浏览器同样受到此问题的影响。 我无法确认 Nexus 手机是否受到影响。

这将是一个很棒的功能,而且实现起来似乎并不困难。 或许可以快速检查一下message.toString() == '[object Event]' ,然后是for-in循环来访问事件对象的属性。 这对于帮助调试 Android 4.1 - 4.4 中的站点问题非常有用。

@d10 – 我已经尝试过了,但我找不到真正的浏览器来验证它是否有效。 我尝试在 BrowserStack 上模拟 Android 4.1 – 4.4 并使用现有的 Android 浏览器,但它们报告错误很好。

那将是一个很棒的功能! 旧浏览器也有同样的问题!

这让我发疯,所以我为此写了一个补丁https://github.com/rollokb/raven-js/tree/feat/old-webkit-Event-handling

在提交拉取请求之前,我将在生产环境中对其进行一些测试。

@rollokb – 提交看起来很棒。 让我知道它在生产中的情况; 之后我很乐意将它合并到 master 中。

伟大的! 它也让我发疯! +1

似乎在生产中运行良好。

编辑:

似乎工作正常,但仅限于我自己触发的事件。 仍然完全没有关于事件内容的信息。

似乎工作正常,但仅限于我自己触发的事件。 仍然完全没有关于事件内容的信息。

问题很可能在这里:

+        for (var property in event) {
+            if (event.hasOwnProperty(property)) {
+                options.extra[property] = event[property];
+            }
+         }

通过检查hasOwnProperty ,您将不会获得任何派生自Event.prototype的属性。 除非这些受影响的浏览器像您在测试中所做的那样——将属性直接放在它们创建的Event对象上——否则我们不会看到任何数据。

另一方面,如果您删除该检查,我们将获得一堆与错误无关的属性。 但它看起来可能值得一看。

你也许是对的。 在使用 PhantomJS 进行测试时,我被这个发现了。

更新了分支
https://github.com/rollokb/raven-js/blob/feat/old-webkit-Event-handling/src/raven.js#L1109 -L1121

凉爽的。 再次,我感谢你深入研究这一点。

有点题外话,但是这个项目是如何加载 PhantomJS 的? 它似乎错误地处理了事件属性(即,它将所有事件道具视为自己的)。

通过kmiyashiro/grunt-mocha

https://github.com/getsentry/raven-js/blob/master/Gruntfile.js#L193

它似乎错误地处理了事件属性(即,它将所有事件道具视为自己的)。

您可以尝试模拟一个与在 Chrome/其他浏览器中观察到的行为相同的事件对象。 (希望发送这些对象的旧版浏览器感觉相似。)

您还可以尝试让测试运行 Phantom2 以查看行为是否更准确。 我相信他们现在运行 1.9.8。

@rollokb – 有这方面的消息吗?

我今天从 Android 4 上的 Facebook Browser v80 中获得了数百个。那不是很旧,是吗?

我们在使用 Android 浏览器的 Android 4.x 上遇到了许多此类错误

我今天从 Android 4 上的 Facebook Browser v80 中获得了数百个。那不是很旧,是吗?

我很确定“Facebook 浏览器”只是 Facebook 包装了内部网络浏览器的任何内容。

基本上,这个错误只会出现在一堆国际版本的安卓手机中。 当您看到此类错误时,请查看您的设备列表,您会注意到它们具有类似三星 GT-S8600 的设备代码——它们不是北美/西方型号。

他们似乎正在使用一些声称是“Chrome Mobile”或“Android Browser”(用户代理很容易伪造)的浏览器分支,但似乎具有不同的错误对象签名。 我很难重现该错误(包括尝试购买其中一些手机用于办公室),但我可能很快就会再试一次。

我们没有在稀有浏览器上遇到这些错误,我们只是在带有 Chrome 51.0.2704 的 Windows 10 上遇到了这些错误

嗨,大家好!

我也有乌鸦报告

...
"exception": {
  "values": [
    {
      "value": "[object Event]",
      "stacktrace": {
        "frames": [
          ...
        ]
      }
    }
  ]
}

在 Android 上的移动浏览器中。 用户代理是
Mozilla/5.0 (Linux; U; Android 4.4.2; de-de; GT-N7100 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

为此 +1

因此,从 3.7.0 开始,我们现在为[object Event]和其他捕获的非错误对象生成合成跟踪。 我建议尝试 3.7.0 并查看您得到的结果。

@benvinegar我安装了 3.7.0,但收到此错误

我正在使用下一个 hack 作为临时解决方案:

    Raven.install();

    if (Raven._processException) {
        const oldProcessException = Raven._processException;

        Raven._processException = function (event, message) {
            if (message && typeof message === 'object') {
                // detect that it's an event
                if (String(message) === '[object Event]') {
                    // message
                    message = stringifyEvent(message);

                    // type
                    event = event || 'event';
                } else {
                    // stringify the other objects
                    try {
                        message = JSON.stringify(message);
                    } catch (e) {
                        //
                    }
                }

                arguments[0] = event;
                arguments[1] = message;
            }

            return oldProcessException.apply(this, arguments);
        };
    }

    function stringifyEvent (event) {
        const data = {
            eventPhase: event.eventPhase,
            type: event.type,
            isTrusted: event.isTrusted,
            returnValue: event.returnValue,
            timeStamp: event.timeStamp
        };

        if (event.target) {
            data.target = {
                src: event.target.src,
                tagName: event.target.tagName || 'UNKNOWN_HTMLELEMENT',
                className: event.target.className,
                readyState: event.target.readyState
            };
        }

        if (event.path) {
            data.path = event.path.map((el) => {
                const tagName = el.tagName || 'UNKNOWN_HTMLELEMENT';
                const className = (el.className || '').replace(/\s+/, '');

                // DIV.class-1.class-2
                return `${ tagName }.${ className }`;
            });
        }

        return JSON.stringify(data);
     }

@webschik这行看起来像是一个错字:

return `${ tagName }.${ className }`;

你确定允许这种结构:

data.path = event.path.map((el) => {

UP:使用此修复程序获取“意外令牌 =>”错误

@webschik

2016-09-23 12 45 43

@AlexanderMatveev ,这是 ES2015 语法。
你可以更换它

@webschik添加了这个 hack,看起来没有任何改变,仍然只是“[object Event]”错误。

@AlexanderMatveev ,这很奇怪,因为这适用于我的项目。 可能我们需要在那里进行更多调查

@webschik

这是脚本顺序:

<script type="text/javascript" src="[raven.min.js version 3.7.0]"></script>
<script>
    Raven.config('https://[...]@sentry.io/[...]', {
        release: '[...]'
    }).install();
</script>
<script type="text/javascript" src="[fix.js without first Raven.install() line]"></script>

@benvinegar我安装了 3.7.0,但收到此错误

你仍然会得到它。 不同之处在于它应该生成一个合成堆栈跟踪。 但是,如果它因为冒泡到 window.onerror 而被捕获,则堆栈跟踪可能没有帮助(但它会告诉您它是如何被捕获的)。

在托管的 Sentry for UA 上与Raven 3.6.1相同: Mozilla/5.0 (Linux; U; Android 3.1; en-gb; GT-P7500 Build/HMJ37) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13

我也有几个事件,其中大部分来自 Android 或 Facebook 浏览器。 甚至应该是最近的 Facebook 95.0 也触发了这个错误。 安卓4 .. 是主要的操作系统,据报道的许多设备都是三星-GT[某物]。 我正在使用 3.7.0 版本。

我们也从一个超级通用的用户代理那里得到了这个,没有特殊的设备:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36

乌鸦 3.9.0

仍然在 3.9.1 上每天发生几百次,在 facebook 和 android browser.name
没有任何堆栈跟踪。

我们应该忽略它吗?

同样在这里。

就像这里的每个人一样。 如果此信息有帮助:

image

UA: Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-I8190L Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/87.0.0.17.79;]

浏览器: Facebook 87.0.0

这里也一样,有解决办法吗?? :S

我有同样的问题

image

我目前有同样的问题......有很多这样的错误,我很快就会达到哨兵阈值😞

我遇到了几十个这样的问题,都是在 Windows 10 上使用 Chrome 45。

它仍在 raven 3.15.0、facebook 和 android 浏览器上发生
我们应该忽略它吗?

有人找到解决方案吗? 在我的情况下,这出现在哨兵中:

`[对象事件]

在 trimHeadFrames(./node_modules/raven-js/src/raven.js:562:1)
在 _logDebug(./node_modules/raven-js/src/raven.js:488:1)
在 G._promiseRejectionHandler(./node_modules/raven-js/src/raven.js:430:1)`

未处理的承诺拒绝:真

用户代理:Mozilla/5.0 (Linux; U; Android 6.0.1; en-US; vivo 1610 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.8.1112 Mobile Safari /537.36

设备系列:vivo 1610
设备型号:1610
设备品牌:vivo

安卓 6.0.1

UC 浏览器 12.5.8

我的 raven-js 客户端版本是:3.25.0

我附上了错误的屏幕截图(在许多旧浏览器中多次发生)
raven-screenshot

这可以在新 SDK 中使用事件提示和自定义错误处理来修复。

@kamilogorek

这可以在新 SDK 中使用事件提示和自定义错误处理来修复。

你能详细说明一下吗? 任何文档链接?
至少我们需要哪个版本?
我更喜欢为这个问题提供那些“事件提示”和“自定义错误处理”设置的代码片段。

谢谢!

@hiroshi请参阅https://github.com/getsentry/sentry-javascript/issues/1401#issuecomment -418631326
这是新的 sentry-javascript SDK 的一个功能,它已作为 RC Today 发布。 它不会被移植回 raven-js/node。

嗨,我一直在 Sentry 中看到这样的错误:

exception | Error: [object Event]

没有附加堆栈跟踪,也没有有用的信息。 从 LogRocket 会话来看,用户似乎没有遇到任何问题。 我确实看到一些对 Facebook 和 Google Tag Manager 的请求被阻止,所以我怀疑他们安装了阻止程序扩展。
这是使用 Chrome 75 的人反复出现的错误,而不是非常旧的浏览器。
有什么建议我将如何解决这个问题?

谢谢

注意:@sentry/浏览器版本 5.3.0

@burtyish更新到最新版本是第一步。 我们在 5.7.0 中引入了很多关于此行为的更改

@kamilogorek谢谢!
现在我已经升级到 sentry.javascript.browser v5.12.1,我看到了一个信息量更大的错误。
而且我也有一个堆栈跟踪!

@burtyish太棒了! :)

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

rowlando picture rowlando  ·  3评论

grigored picture grigored  ·  3评论

mogelbrod picture mogelbrod  ·  3评论

dimmduh picture dimmduh  ·  3评论

ma2gedev picture ma2gedev  ·  3评论