Chrome crash, "Aw, Snap!" error #1423

Closed
xfd opened this Issue Jan 17, 2014 · 26 comments

Projects

None yet
@xfd

Chrome version: 32.0.1700.77
moment.js version: 2.5.0
moment-timezone.js version: 0.0.3

Run below code in Chrome browser (multiple page refreshes could be required to reproduce error):

<!DOCTYPE html>
<html>
    <head>
        <script src="moment.js">
        </script>
        <script src="moment-timezone.js">
        </script>
        <script src="moment-timezone-data.js">
        </script>
    </head>
    <body>
        <script>
            "use strict";
            for(var i = 0; i < 100; i++) {
                moment(1405461600000);
                moment().tz("America/North_Dakota/Beulah");
            }
        </script>
    </body>
</html>

This has something to do with JS execution optimizations. If you change order of properties in moment(), makeMoment() function call to the same as in moment.utc() function:

{
    _useUTC : false,
    _isUTC : false,
    _l : lang,
    _i : input,
    _f : format,
    _strict : strict
}

problem is gone. I think this is bug in Chrome, but you can fix it easily in your library.

@ichernev

You can report this with chrome too. Patches are welcome :)

@bblack

For what it's worth, I can confirm a similar intermittent error on Chrome 32.0.1700.77 that did not happen in any Chrome version prior. With moment.js 2.1.0, I can prevent the error in a similar way, by replacing the block

    moment = function (input, format, lang) {
        return makeMoment({
            _i : input,
            _f : format,
            _l : lang,
            _isUTC : false
        });
    };

with

    moment = function (input, format, lang) {
        var h = {};
        h._i = input;
        h._f = format;
        h._l = lang;
        h._isUTC = false;
        return makeMoment(h);
    };

@xfd have you reported this to the Chrome/Chromium/V8 projects?

@tatey tatey added a commit to thebestday/moment that referenced this issue Jan 20, 2014
@tatey tatey Change object construction to prevent Chrome v32 crashing.
Suspected JS execution optimizations in v32 is causing the browser to
throw "Aw, Snap".

See moment#1423
080c731
@xfd

@bblack I've only reported it via Chrome's "Report an issue…" form.

@alexions

Hello,

I would like to know when this fix will be released, and new builds will be available.
We use moment.js in our products (cs-cart.com) and want to fix the Chrome 32 bug as soon as possible, because it is very critical for our customers.

Thanks!

@lygaret

Borrowed the patch from @tatey, and we're back in service in production. Thanks!!!

@ichernev

@alexions I'll try to make an earlier release later today. In the mean time you can use the patch in #1429.

@alexions

@ichernev Thanks a lot!

@ichernev ichernev closed this Jan 22, 2014
@ichernev

@alexions Released 2.5.1

@tatey

@xfd Do you have a link to the bug report? I can attach my crash ID to the report and reference it in #1429.

I've tried to isolate the issue without our production stack and haven't had any success. We use moment in a "widget" which gets injected into third party websites through an iframe.

@tybro0103

Geez this was hard to track down. The crash was so rare, and sometimes instead of crashing it would throw a stack overflow error, but the stack trace was not deep and never in the same place.

@niemyjski

Thank you so much!! I was trying to figure this out and then I noticed all the timer fired events coming from moment and then figured I'd look there.

@niemyjski

Did anyone report this to chrome as a bug? I think we should still commit it as a bug as it was pretty crazy to get a random tab crash.

@dansimpson

@niemyjski I agree, the patch fixes the issue here, but there is another underlying problem being masked. When reading the patch I wonder why the patch works. @tatey do you happen to know more about this or was it more of a trial by error thing?

@tatey
@dansimpson

Thanks @tatey. I wasn't sure which came first. I'll see about submitting an issue to the chrome project.

@dansimpson

@xfd can you package up your reproduction files or throw them in a repository? This way we have something to give that reproduces the error.

@niemyjski

I just wanted to let you all know that I think this still could be an issue. I just hit the Awe snap issue on staging (praying to god I don't see it again).

@xfd

Files required to reproduce bug: https://dl.dropboxusercontent.com/u/68860725/chrome_v32_bug_reproduce.zip. It not always occurs at first time, refresh page multiple times. I've only reported bug by Chrome's built-in form, so I don't have id or link. Probably this is V8 JS optimization issue, so should be reported there.

@dansimpson

I submitted an issue to chromium. I'll update with the issue if it is made visible.

@dansimpson

Alright, it was considered a duplicate and merged with this issue: https://code.google.com/p/chromium/issues/detail?id=333594

@balnagy

You are awesome. Save my day! :) Thanks.

@niemyjski

I'm still seeing this crash with the latest version of chrome and momentjs.

@mjebrini

I face the same problem,
TypeError: Object function (input, format, lang, strict) {
var c;

    if (typeof(lang) === "boolean") {
        strict = lang;
        lang = undefined;
    }
    // object construction must be done this way.
    // https://github.com/moment/moment/issues/1423
    c = {};
    c._isAMomentObject = true;
    c._i = input;
    c._f = format;
    c._l = lang;
    c._strict = strict;
    c._isUTC = false;
    c._pf = defaultParsingFlags();

    return makeMoment(c);
} has no method 'format'
@ichernev

@mjebrini you're trying to call moment.format() instead of moment().format()

@jniemin

I had this same crash with 2.13.0 version when using it through webpack. I wasn't able to pinpoint the exact reason for the crash. I'm importing the package through NPM and after calling some hundreds of time in loop moment.utc(0) I got Chrome 50 crashing (Firefox 45 and Safari 9.1 works correctly).

Also seems that if I just import moment in html using <script> and then using webpack
externals: {
'moment':'moment'
}
it works fine. Also if I removed all references to the moment.js from the page, it worked without crash, so it must be something related to how webpack/npm and work together.

@AStaroverov

Crashed in chrome 52
Use with webpack and react

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment