Search Unity

"RangeError: Maximum call stack size exceeded" after Unity has loaded in WebGL.

Discussion in 'Web' started by ViLLE-Team, Jun 12, 2015.

  1. ViLLE-Team


    Jun 12, 2015

    I'm currently trying to solve above problem in our educational game project and I have come to a dead end with searching solutions all around internet.

    Our team is trying to integrate Unity game in to our own system built and coded with Vaadin, Java and Javascript. The thing is that our game needs to take parameters as "setups" from our system and use them in the game and when game is done, send something back with callback function. This all works perfectly in the game and via the index file created during conversion to WebGL platform game, I can send parameters to the game and it works with those "setups".However I have managed to encounter the above error when trying to integrate the game int to our system.

    First I tried to do it with <iframe> by putting the tags in to our systems running init.js file which executes function creating the iframe in the html. In the iframe, i just open the Unity generated index file and it shows the game inside the iframe without problems. (in this point, I have not change anything in the files given from Unity) So this solution works well. (code and picture link below)
    Code (JavaScript):
    1. $(this.getElement()).append('<iframe src="VAADIN/themes/vexer-catch_the_numbers/index.html" height="768" width="1024" frameborder="0"></iframe>');

    Now the first part of the problem I encountered was that sending parameters through iframe is the worst scenario you could ever imagine. That is 'cos the only way to do it is via the url, so we tried to find a way around this "last solution". We found out that it's possible (and even advisable) to do so by just getting all the code from the index file to the init.js file where I first had the iframe. As we did so, the code looked like this.
    Code (JavaScript):
    2. var $thisElement = $(this.getElement());
    3. (function(){
    4.         $thisElement.append('<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" height="768px" width="1024px"></canvas>');
    5.         function OnUnityReady(){
    6.             var difficultyMode = "false";
    7.             var allowNumCollect = "true";
    8.             var sTime = 60;
    9.             var scoreTime = 3;
    10.             var scoreAmount = 5;
    11.             var dropRange = 6.0;
    13.             var timeLeft = "TIME LEFT:";
    14.             var score = "SCORE:";
    15.             var gameOver = "GAME OVER";
    16.             var collection = "COLLECTED NUMBERS:";
    17.             var answersToCollect = "ANSWERS TO COLLECT:";
    18.             var translations = timeLeft + "/" + score + "/" + gameOver + "/" + collection + "/" + answersToCollect;
    20.             var startGravity = 0.2;
    21.             var firstNumber = 1;
    22.             var secondNumber = 10;
    23.             var expOperator = "+";
    24.             var numToCollect = 2;
    25.             var difficultyTime = 60.0;
    26.             var stoppedForTime = 5.0;
    28.             SendMessage("Setup", "SetDifficulty", difficultyMode);
    29.             SendMessage("Setup", "SetAllowNumCollect", allowNumCollect);
    30.             SendMessage("Setup", "SetStartTime", sTime);
    31.             SendMessage("Setup", "SetScoreTime", scoreTime);
    32.             SendMessage("Setup", "SetScoreAmount", scoreAmount);
    33.             SendMessage("Setup", "SetDropRange", dropRange);
    34.             SendMessage("Setup", "SetLanguage", translations);
    35.             SendMessage("Setup", "SetStartGravity", startGravity);
    36.             SendMessage("Setup", "SetFirstNumber", firstNumber);
    37.             SendMessage("Setup", "SetSecondNumber", secondNumber);
    38.             SendMessage("Setup", "SetExpOperator", expOperator);
    39.             SendMessage("Setup", "SetNumToCollect", numToCollect);
    40.             SendMessage("Setup", "SetDifficultyTime", difficultyTime);
    41.             SendMessage("Setup", "SetStoppedForTime", stoppedForTime);
    42.         }
    43.         function EndGame(){
    44.             gameClosed = true;
    45.             console.log("Is game closing: " + gameClosed);
    46.             //window.document.close();
    47.         }
    49.         function Callback(score){
    50.             console.log("Game won with score: ", score);
    51.         }
    52.         // connect to canvas
    53.         var Module = {
    54.                 TOTAL_MEMORY: 268435456,
    55.                 filePackagePrefixURL: "/xxx/xxx/xxx/Release/",
    56.                 memoryInitializerPrefixURL: "/xxx/xxx/xxx/Release/",
    57.                 preRun: [],
    58.                 postRun: [],
    59.                 print: (function() {
    60.                     return function(text) {
    61.                         console.log (text);
    62.                     };
    63.                 })(),
    64.                 printErr: function(text) {
    65.                     console.error (text);
    66.                 },
    67.                 canvas: document.getElementById('canvas'),
    68.                 progress: null,
    69.                 setStatus: function(text) {
    70.                     if (this.progress == null)
    71.                     {
    72.                         if (typeof UnityProgress != 'function'){
    73.                             return;
    74.                         }
    75.                         this.progress = new UnityProgress (canvas);
    76.                         console.log("11");
    77.                     }
    78.                     if (!Module.setStatus.last) Module.setStatus.last = { time:, text: '' };
    79.                     if (text === Module.setStatus.text) return;
    80.                     this.progress.SetMessage (text);
    81.                     var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
    82.                     if (m){
    83.                         this.progress.SetProgress (parseInt(m[2])/parseInt(m[4]));
    84.                     }
    85.                     if (text === ""){
    86.                         this.progress.Clear()
    87.                     }
    88.                 },
    89.                 totalDependencies: 0,
    90.                 monitorRunDependencies: function(left) {
    91.                     this.totalDependencies = Math.max(this.totalDependencies, left);
    92.                     Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
    93.                 }
    94.         };
    95.         Module.setStatus('Downloading (0.0/1)');
    96.         var script = document.createElement('script');
    97.         script.type = 'text/javascript';
    98.         script.src = 'xxx/xxx/xxx/UnityConfig.js';
    99.         $thisElement.append(script);
    100.         console.log("20" + script);
    101.         script = document.createElement('script');
    102.         script.type = 'text/javascript';
    103.         script.src = 'xxx/xxx/xxx/fileloader.js';
    104.         $thisElement.append(script);
    105.         if (!(!Math.fround)) {
    106.             var script = document.createElement('script');
    107.             script.src = "/xxx/xxx/xxx/CatchTheNumber.js";
    108.             document.body.appendChild(script);
    109.         } else {
    110.             var codeXHR = new XMLHttpRequest();
    111.   'GET', '/xxx/xxx/xxx/CatchTheNumber.js', true);
    112.             codeXHR.onload = function() {
    113.                 var code = codeXHR.responseText;
    114.                 if (!Math.fround) {
    115.                     try {
    116.                         console.log('optimizing out Math.fround calls');
    117.                         var m = /var ([^=]+)=global\.Math\.fround;/.exec(code);
    118.                         var minified = m[1];
    119.                         if (!minified) throw 'fail';
    120.                         var startAsm = code.indexOf('// EMSCRIPTEN_START_FUNCS');
    121.                         var endAsm = code.indexOf('// EMSCRIPTEN_END_FUNCS');
    122.                         var asm = code.substring(startAsm, endAsm);
    123.                         do {
    124.                             var moar = false; // we need to re-do, as x(x( will not be fixed
    125.                             asm = asm.replace(new RegExp('[^a-zA-Z0-9\\$\\_]' + minified + '\\(', 'g'), function(s) { moar = true; return s[0] + '(' });
    126.                         } while (moar);
    127.                         code = code.substring(0, startAsm) + asm + code.substring(endAsm);
    128.                         code = code.replace("'use asm'", "'almost asm'");
    129.                     } catch(e) { console.log('failed to optimize out Math.fround calls ' + e) }
    130.                 }
    131.                 var blob = new Blob([code], { type: 'text/javascript' });
    132.                 codeXHR = null;
    133.                 var src = URL.createObjectURL(blob);
    134.                 var script = document.createElement('script');
    135.                 script.src = URL.createObjectURL(blob);
    136.                 script.onload = function() {
    137.                     URL.revokeObjectURL(script.src);
    138.                 };
    139.                 document.body.appendChild(script);
    140.             };
    141.             codeXHR.send(null);
    142.         }
    143.     })();
    After doing this the real problem (the part 2) started. So if I'm correct, when this init.js file is executed by our system, it creates the canvas (that index already had) and then executes the other scripts as the index did too and in the same order. I tried to debug the code through with console.log() and it went through the whole code normally. The problem itself occurred after the so called "initialization of the game". So my final question is where did I go wrong, when the game (tested both, chrome and Firefox) throws me ""RangeError: Maximum call stack size exceeded" (though Firefox gives only ”Too much recursion” error) PLEASE help me with this, I peg you (on my knees, of course). I also attached some files to be clearer with all this.

    Attached Files:

    Last edited: Jun 12, 2015
  2. jonas-echterhoff


    Unity Technologies

    Aug 18, 2005
    This can currently happen in WebGL when it tries to find a function which is getting stripped (and then some code endlessly recurses trying to find that function). We are fixing this to do better error reporting, until then, try putting in some Debug prints in the code around where the issue happens, to find out what code it is calling, so you might see which function is getting stripped.
  3. ViLLE-Team


    Jun 12, 2015
    Okey, I tried to debug through the code from the init.js file and put some console.debugs through out the initialization function. It goes through it without problems but the RangeError comes after the game has gone through the initialization. That's why I was so confused that where the error could come from. But should I still try to put some debugs in the game itself? I also took some pictures from the PlayerSettings of the game. The point is to get as small game package as possible so if you know some tricks to that too, let me know.
    Last edited: Jun 15, 2015
  4. notprathap


    Jan 18, 2013
    I ran into the same issue as well. Jonas, what do you mean by "stripped"?
  5. ViLLE-Team


    Jun 12, 2015
    One step closer to the error once again. I tried the console trick and took it further on. I put console.logs all over the UnityConfig.js and fileloader.js files and was able to locate one kind of source where it comes from. Here is the fileloader.js
    Code (JavaScript):
    1. function runWithFS() {
    2.                 console.log("Fileloader 24");
    3.                 function assert(check, msg) {
    4.                     console.log("Fileloader 25");
    5.                     if (!check) throw msg + new Error().stack;
    6.                 }
    7.                 Module['FS_createPath']('/', 'Resources', true, true);
    8.                 console.log("Fileloader 26");
    9.                 function DataRequest(start, end, crunched, audio) {
    10.                     this.start = start;
    11.                     this.end = end;
    12.                     this.crunched = crunched;
    13.            = audio;
    14.                     console.log("Fileloader 27");
    15.                 }
    16.                 DataRequest.prototype = {
    17.                         requests: {},
    18.                         open: function(mode, name) {
    19.                             console.log("Fileloader 28");
    20.                    = name;
    21.                             this.requests[name] = this;
    22.                             Module['addRunDependency']('fp ' +;
    23.                         },
    24.                         send: function() {},
    25.                         onload: function() {
    26.                             console.log("Fileloader 29");
    27.                             var byteArray = this.byteArray.subarray(this.start, this.end);
    29.                             this.finish(byteArray);
    31.                         },
    32.                         finish: function(byteArray) {
    33.                             console.log("Fileloader 30");
    34.                             var that = this;
    35.                             Module['FS_createPreloadedFile'](, null, byteArray, true, true, function() {
    36.                                 Module['removeRunDependency']('fp ' +;
    37.                             }, function() {
    38.                                 if ( {
    39.                                     console.log("Fileloader 31");
    40.                                     Module['removeRunDependency']('fp ' +; // workaround for chromium bug 124926 (still no audio with this, but at least we don't hang)
    41.                                 } else {
    42.                                     console.log("Fileloader 32");
    43.                                     Module.printErr('Preloading file ' + + ' failed');
    44.                                 }
    45.                             }, false, true); // canOwn this data in the filesystem, it is a slide into the heap that will never change
    46.                             this.requests[] = null;
    47.                         },
    48.                 };
    49.                 console.log("Fileloader 33");
    50.                 new DataRequest(0, 31356, 0, 0).open('GET', '/mainData');
    51.                 new DataRequest(31356, 31588, 0, 0).open('GET', '/methods_pointedto_by_uievents.xml');
    52.                 new DataRequest(31588, 4403916, 0, 0).open('GET', '/sharedassets0.assets');
    53.                 new DataRequest(4403916, 4410113, 0, 0).open('GET', '/sharedassets0.resource');
    54.                 new DataRequest(4410113, 5985149, 0, 0).open('GET', '/Resources/unity_default_resources');
    55.                 new DataRequest(5985149, 6485625, 0, 0).open('GET', '/Resources/unity_builtin_extra');
    56.                 console.log("Fileloader 34");
    57.                 function processPackageData(arrayBuffer) {
    58.                     console.log("Fileloader 35");
    59.                     Module.finishedDataFileDownloads++;
    60.                     assert(arrayBuffer, 'Loading data file failed.');
    61.                     var byteArray = new Uint8Array(arrayBuffer);
    62.                     var curr;
    63.                     console.log("Fileloader 36");
    64.                     // Reuse the bytearray from the XHR as the source for file reads.
    65.                     DataRequest.prototype.byteArray = byteArray;
    66.                     DataRequest.prototype.requests["/mainData"].onload();
    67.                     DataRequest.prototype.requests["/methods_pointedto_by_uievents.xml"].onload();
    68.                     DataRequest.prototype.requests["/sharedassets0.assets"].onload();
    69.                     DataRequest.prototype.requests["/sharedassets0.resource"].onload();
    70.                     DataRequest.prototype.requests["/Resources/unity_default_resources"].onload();
    71.                     DataRequest.prototype.requests["/Resources/unity_builtin_extra"].onload();
    72.                     Module['removeRunDependency']('');
    73.                     console.log("Fileloader 37");
    74.                 };
    75.                 Module['addRunDependency']('');
    76.                 console.log("Fileloader 38");
    77.                 if (!Module.preloadResults) Module.preloadResults = {};
    78.                 console.log("Fileloader 39");
    79.                 Module.preloadResults[PACKAGE_NAME] = {fromCache: false};
    80.                 if (fetched) {
    81.                     console.log("Fileloader 40");
    82.                     processPackageData(fetched);
    83.                     fetched = null;
    84.                 } else {
    85.                     console.log("Fileloader 41");
    86.                     fetchedCallback = processPackageData;
    87.                 }
    88.                 console.log("Fileloader 42");
    89.             }
    90.             if (Module['calledRun']) {
    91.                 console.log("Fileloader 43");
    92.                 runWithFS();
    93.             } else {
    94.                 console.log("Fileloader 44");
    95.                 if (!Module['preRun']) Module['preRun'] = [];
    96.                 Module["preRun"].push(runWithFS); // FS is not initialized yet, wait for it
    97.             }
    Now I get the error somewhere around here:
    (This is from my browsers console prints)
    Fileloader 24
    Fileloader 26
    Fileloader 33
    Fileloader 27
    Fileloader 28
    Fileloader 27
    Fileloader 28
    Fileloader 27
    Fileloader 28
    Fileloader 27
    Fileloader 28
    Fileloader 27
    Fileloader 28
    Fileloader 27
    Fileloader 28
    Fileloader 34
    Fileloader 38
    Fileloader 39
    Fileloader 40
    Fileloader 35
    Fileloader 25
    Fileloader 36
    Fileloader 29
    Fileloader 30
    Fileloader 29
    Fileloader 30
    Fileloader 29
    Fileloader 30
    Fileloader 29
    Fileloader 30
    Fileloader 29
    Fileloader 30
    Fileloader 29
    Fileloader 30
    Fileloader 37
    Fileloader 42
    Invoking error handler due to
    Uncaught RangeError: Maximum call stack size exceeded

    Attached the console logs to different files, so it's clearer to see the differents

    Attached Files:

    Last edited: Jun 16, 2015
  6. jonas-echterhoff


    Unity Technologies

    Aug 18, 2005
    We strip code which is not used during the build. However, sometimes, we cannot determine that a method or type is being used - typically when something is trying to call them by reflection by name, and may end up incorrectly stripping that code. You can use a link.xml file as described here to work around that:
  7. ViLLE-Team


    Jun 12, 2015
    So how about the reading order of the files. According to those files I posted earlier, the iframe has different reading order than when I'm trying to execute all from one js file. Any suggestions to that?
  8. notprathap


    Jan 18, 2013
    Oh right, thanks for the explanation. Just so everyone knows, in my case, the rangeerror was actually caused by a method that was throwing a null reference exception - once I fixed that, this error stopped appearing.
  9. maudlinmonkey


    Jun 14, 2014
    Also happens when trying to use Unity Analytics on WebGL...

    And by use, I mean just having 'using UnityEngine.Analytics'
    Last edited: Jul 22, 2015
  10. dreg_master


    Jan 4, 2016
    Hi There,

    I know this is old thread, this is happening to me now, has happened in past but resolved itself, so I'm not sure to wait it out or try troubleshoot. I need some help. I've scoured the web for a few days now on google and stack overflow etc. My game stopped working on WebGL after the Unity update 2018.1.0f2 Personal. Now WebGL fails, but runs in editor and PC builds fine. I have played around allot with the player settings to no avail. There are no errors in my code(from what i can tell), worked before the update.

    Google Chrome gives error - Uncaught RangeError: Maximum call stack size exceeded.
    Firefox gives error - too much recursion

    My next step it to try debug chrome and firefox, but I am unsure and not sure if it is worth it, so if anyone know anything please inform me.
  11. dreg_master


    Jan 4, 2016
    SOLVED. For me it was to set in the WebGL Player settings API Compatibility level to .Net Standard 2.0
    tytbone likes this.
  12. IAmPatSilva


    Dec 30, 2015
    Instead of Creating a new Thread, I felt that this one was very relevant to what I was going through in Unity 2018.1.0f.

    My Problem: I received the Range Error with a project that was a part of a series of simulations, they all are their own builds and runs similarly simulating different devices. So far everyone of them was working except for one particular project. I kept running into this error on Google Chrome. now I did not test it on any other browsers.

    I tried to change the API Compatibility Level to .NET 2.0, not the subset. However I still ran into this error

    Solution: After more research I found this thread

    The first response declared that Clearing Chrome's Data fixed the problem. This worked for me, however I do not want my users to have to clear chrome's data if they run into this error.

    My Question: Is there a way where I can avoid this error all together?
    TheVirtualMunk likes this.
  13. jvalenciag


    Dec 2, 2018
    For me neither cleaning Chrome's data nor changing the API compatibility level, didn't worked for me, anyone knows if there is a bug report created?
  14. Raybosama


    Nov 7, 2018
    I had similar problems with the Chrome browser, even with API Compatibility Level set to .NET 2.0. To fix it I went to the Resolution and Presentation settings of Player Settings and selected Minimal WebGL Template. Then rebuilt and redeployed.

    Last edited: Mar 15, 2019
  15. tytbone


    Jul 16, 2013
    Sorry for the bump but I think (fingers crossed) this solved the same "rangeerror maximum call stack" error I had (changing Scripting Runtime Version to 4.0 first, then Net Standard 2 became available as an Api Compatibility Level option), so I really appreciate you posting this as I don't know if I would have figured that out myself. (I combined it with Raybosama's suggestion of "Minimal WebGL Template" too just to be safe since I'm not close to being a pro at developing and debugging. :p) I'm still on 2018.2.11f1 so maybe that caused some issue(s).
  16. The_Devil


    Jun 6, 2015
    I have a simple scene with two 3D models ( and two dynamic lights. This scene loads fine on both desktop , android and iphones (total file size was under 5 MB). I added a single Text Mesh Pro label to the scene was updating it through code (sort of like a debug log but visible on screen) and this worked correctly on android and desktop. But when I try to run on safari or chrome on an iPhone 7 running ios version 13.1.1 it does not load. It shows the warning message (which it showed earlier too) and on pressing ok it proceeds to load the scene. It stops at about 90% with the following stack trace :

    Code (CSharp):
    1. Warning: Unsupported graphics API WebGL 2.0
    2. [UnityCache] '' successfully revalidated and served from the indexedDB cache
    3. [UnityCache] '' successfully revalidated and served from the indexedDB cache
    4. [UnityCache] '' successfully revalidated and served from the indexedDB cache
    5. failed to asynchronously prepare wasm: Error: Out of executable memory in function at index 29257
    6. Error: Out of executable memory in function at index 29257
    7. Error: Out of executable memory in function at index 29257
    8. still waiting on run dependencies:
    9. dependency: wasm-instantiate
    10. (end of list)
    11. still waiting on run dependencies:
    12. dependency: wasm-instantiate
    13. (end of list)
    14. still waiting on run dependencies:
    15. dependency: wasm-instantiate
    16. (end of list)
    17. still waiting on run dependencies:
    18. dependency: wasm-instantiate
    19. (end of list)
    20. still waiting on run dependencies:
    21. dependency: wasm-instantiate
    22. (end of list)
    23. still waiting on run dependencies:
    24. dependency: wasm-instantiate
    25. (end of list)
    26. still waiting on run dependencies:
    27. dependency: wasm-instantiate
    28. (end of list)
    29. still waiting on run dependencies:
    30. dependency: wasm-instantiate
    31. (end of list)
    32. still waiting on run dependencies:
    33. dependency: wasm-instantiate
    34. (end of list)
    35. still waiting on run dependencies:
    36. dependency: wasm-instantiate
    37. (end of list)
    38. still waiting on run dependencies:
    39. dependency: wasm-instantiate
    40. (end of list)
    It then shows a popup with the message "RangeError: Maximum call stack size exceeded".

    I have tried restarting the phone, clearing the cache, the scripting run-time version is set to .Net 4,x Equivalent, set the display to minimal as mentioned above, increased memory to 512 from 256 under Publishing settings. I have no idea what else to try. I have new to web development and hence have to idea on how to proceed ahead. Any help would be appreciated.
  17. iLyxa3D


    Sep 25, 2013
    Try to clear browser cache (Ctrl+F5). Sometimes it helps with this bugs.
  18. jukka_j


    Unity Technologies

    May 4, 2018
    This is a painful issue we are very well aware of with older versions of Safari. These are reported as

    The problem should be fixes in newer versions of Safari. If the issue still reproduces in latest Safari browsers, please let us know.
  19. jimmack


    May 2, 2016
    Thank you. This was all it took for me. Now. If only the Unity team can get gzip compression working properly with the Linux version of 2020.2 :)
  20. jukka_j


    Unity Technologies

    May 4, 2018
    I was not aware of an issue on this front (granted, I don't have a Linux development system available atm - another engineer is looking at Linux WebGL support for Unity 2021.2 release). Is there a specific error you get? I could route that by him if so.
  21. maximiliananzinger


    Mar 4, 2020
    Same error here: "RangeError: Maximum call stack size exceeded"

    I tried a new Unity scene without any modificiation.
    Unity Version is 2020.03.0f1 and I set the compatibility to .Net Standard 2.0, as well as chose the minimal template.
    This did not solve the issue for me.
    Clearing Browser Cache also didn't help.

    Chrome error is the one already mentioned above: "RangeError: Maximum call stack size exceeded"
    Firefox error is: " RangeError: too many arguments provided for a function call" -> loader.js with statement:
    "apply(null, e.subarry(r,r+1));r+=i ..."
    _TheFuture_ likes this.
  22. roka


    Sep 12, 2010
    Same problem with Unity 2021.1.7f1 (64-bit)

    gzip ==> fail to load with "RangeError: Maximum call stack size exceeded"
    Brotli ==> working
    _TheFuture_ likes this.
  23. jukka_j


    Unity Technologies

    May 4, 2018
    These are errors that we have not seen reported before. When you get this issue, was the project built with the "Compression Fallback" option enabled or disabled?

    My suspect is that the error message would be coming from the software-based compression fallback code, that would be good to confirm.

    Do you have a failing build somewhere you could zip up?
  24. ralf_b


    Jul 9, 2013
    Sorry to necro this thread ongoing since 2015 but I also do have jsStackTrace and wasm-function errors starting today.

    I have tried Unity 2021.1.15f1:
    + Api Compatibility Level ".Net Standard 2.0"
    + Managed Stripping level "Low"
    + Compression Fallback "enabled" / "disabled"
    + Strip Engine Code "enabled" / "disabled"
    + Optimize Mesh Data "enabled" / "disabled"

    WTF?! Moment of the day Unity 2021.1.15f1:
    I have reverted all the above mentioned settings to the ones from yesterday and now everything works again (in Edge, Chrome and Firefox on PC)

    + Api Compatibility Level ".Net Standard 2.0"
    + Managed Stripping level "Low"
    + Compression Fallback "enabled"
    + Strip Engine Code "enabled"
    + Optimize Mesh Data "enabled"

    Unfortunately this might not be as much help for others running into these problems but maybe the Unity team might get a better overall picture of this long standing issue. To me it seems like that when building a WebGL the outcome might vary regardless if changes have been made or not, which makes reliable development a hit or miss thing.

    Speaking of which maybe I am missing something fundamental though I just hope this can be resolved one day without us / me getting mails from clients (also on PC using either Edge or Chrome and a small team of Mac users also using Chrome) reporting this issue.
    saltytunaicecream likes this.
  25. G33RT


    Dec 27, 2013
    I seem to be having the seem issue after an upgrade from 2021.2.0b15 to 2021.2.0b16
    manuelgoellnitz likes this.
  26. manuelgoellnitz


    Feb 15, 2017
    I can confirm this!
    Error occurs on b16 and build works without errors on b15.
    Maybe it has something todo with URP?
    Unity complained when I downgraded and there was an update from b15 to b16
  27. KamilCSPS


    May 21, 2020
    Had the error, try "Clean Build" to remove IL2CPP code cache. It fixed it for me.
  28. markovicho


    Nov 2, 2016
    same here. thanks for sharing the solution !
  29. _TheFuture_


    Mar 11, 2016
    We were experiencing the same issue @roka mentioned at first, where the non-compressed build worked but using Gzip expression resulted in this error. However, this seems to be misleading, after cleaning the GI Cache (Edit -> Preferences... -> GI Cache), as @KamilDA suggested, the Gzip compressed built worked just as fine for us. So it looks like a caching related issue indeed.

    Also worth to mentioned we crashed at the same place
    Code (JavaScript):
    1. ...apply(null, e.subarry...
    mentioned by @maximiliananzinger and only in Chrome (Edge and Firefox worked) on some machines. Pretty weird.
  30. Mehrdad995


    Jul 17, 2013
    In my case there were two problems, I had added a .jslib plugin to my assets letting me know if a device the WebGL build is running on is a mobile or a desktop. The addition of the plugin somehow corrupted the build then I noticed that if I don't use the "Build And Run" option unity wouldn't update the "___.wasm.unityweb" file alongside "___.loader.js" but by choosing the "Build And Run" it would recreate the "___.wasm.unityweb" file again, however, very mysteriously my problem wasn't solved which was due to chrome's caching the old script. As on mobile, we don't have the Ctrl+F5 option so the workaround is to close the tab and reopen it using the URL, not history.
  31. KnewK


    Sep 2, 2012
    Hi, I had an older loading script stuck in UnityCache IndexedDB causing this error in Chome browser. Fixed with this procedure.
    Chromium browser web cache clearing UnityCache via developer tool
    • Press F12 on your keyboard while the game is in the foreground tab.
    • Then click on the Application tab at the top of the screen
    • Click in this tab on the left side on "Indexed DB" and expand it
    • Then click on the entry "UnityCache -".
    • On the right side then click on "Delete Database"
    Dance_M likes this.
  32. Destrucity


    Sep 28, 2014
    Just want to report that this solution worked for me. Thanks!
    tkoknordic likes this.
  33. sampenguin


    Feb 1, 2011
  34. epratt


    Oct 15, 2019
    In my situation, we were using CI/CD to automatically build and deploy our app on Kubernetes deployed on AWS. Everything done via script. What drove me crazy is if I manually built from my machine and deployed it in a docker container or deployed it on our own network via CI/CD it would work just fine.

    What's more is it would work if I opened it in incognito mode or after clearing browser cache as many have suggested (Which I don't find is an acceptable solution for users)

    What finally fixed it for me is updating player settings in the build script. The container that it gets deployed on is configured to use Gzip to serve the files, so the following player settings were configured:

    Code (CSharp):
    1. PlayerSettings.WebGL.compressionFormat = WebGLCompressionFormat.Gzip;
    2. PlayerSettings.WebGL.decompressionFallback = false;
    3. PlayerSettings.WebGL.dataCaching = false;
    I disabled decompression fallback after @jukka_j mentioned that could be the cause. I also disabled data caching just in case and it appears to have resolved my issues.

    Using Unity 2020.3.28f
    Last edited: Nov 3, 2022
  35. AkshayGhosh


    Jan 8, 2017
    hi @IAmPatSilva did you get a solution?
  36. theVirtunaut


    Sep 28, 2013
    It's 2023 and this bug still comes up. Any new info?
  37. King9999


    Sep 21, 2017
    I ran into this error the other day. The problem for me was that the engine code that was required for Toggles (checkboxes) to work properly was stripped. Instead of changing the stripping level, my solution was to use a Button instead of Toggle.

    If anyone else is using Toggles in their games, you might want to consider using Buttons instead. Otherwise, you might not want to strip any engine code, or keep it to the default level. But this will increase the size of your build, which probably isn't ideal for WebGL games.
    Last edited: Mar 31, 2023
  38. halfdan87


    Jul 8, 2019
    I had the same with github and GameCI. I deployed to Hetzner and served with nginx.
    It turns out my configuration didn't handle gzip in nginx config.
    I added these in my config for my domain in server block:

    Code (CSharp):
    1.     location ~ \.wasm\.gz$ {
    2.         add_header Content-Encoding gzip;
    3.         default_type application/wasm;
    4.         gzip off;
    5.     }
    6.     location ~ \.data\.gz$ {
    7.         add_header Content-Encoding gzip;
    8.         default_type application/octet-stream;
    9.         gzip off;
    10.     }
    11.     location ~ \.js\.gz$ {
    12.         add_header Content-Encoding gzip;
    13.         default_type text/javascript;
    14.         gzip off;
    15.     }
    It helped. Probably for apache or other server apps you have to figure out something else.
    But it will be probably nothing that ChatGPT wouldn't have an answer to ;)
  39. Artificialized


    Oct 5, 2014
    Im getting this error when building a WebGL Build in unity editor 2020.3.47f1 rangerror: maximum file call stack exceeded
  40. Oleksandr_Kryvonos


    Dec 11, 2014
    I overcame the issue with some of these settings in "Player Settings":
    1) "Publishing Settings" -> "Compression Format: Disabled"
    2) "Other Settings" -> "C++ Compiler Configuration: Debug"
    3) "Other Settings" -> "Stack Trace: Full (for every option)"
  41. Reeti_Maurya


    Jul 19, 2021
    If anyone is wondering, this code is available in Unity manual for webgl server configuration sample. And yes, there are also sample codes available for Apache and IIS. Here,
    unityruba likes this.
  42. ExNinja


    Dec 4, 2013
    Just ran into this issue in Unity 2020.3.47.

    Turning off Decompression Fallback in Publishing Settings fixed it for me.
  43. feefbro


    Oct 14, 2023
    I had this issue, but fixed it by clearing all browser caches, and then refreshing the site.
    Dance_M likes this.
  44. Dance_M


    Aug 17, 2014
    Clearing browser cache helped. Unity 2022.3.13f1. All projects settings by default, br compression settings added to the server.
  45. RobAtApex


    Jun 19, 2017
    Still an issue in Unity 2022.3.19. Fixed by doing a hard reload of the page, but that requires work from the user, and we don't want to force a hard reload every time. Happens to some users on some platformsm but not all.

    I suspect all the changes to compression settings etc really just work because they effectively force a hard reload.

    And if they're on Android, it's non-trivial for the user to do a hard reload, and is different for every browser. It's a real pain that this keeps happening.
    makaka-org likes this.