public static void PrintError(IntPtr ctx, int idx, string filename) { string err; if (DuktapeDLL.duk_is_error(ctx, idx)) { DuktapeDLL.duk_get_prop_string(ctx, idx, "stack"); err = DuktapeDLL.duk_safe_to_string(ctx, -1); DuktapeDLL.duk_pop(ctx); } else { err = DuktapeDLL.duk_safe_to_string(ctx, idx); } if (duk_source_position != default_duk_source_position) { var errlines = err.Split('\n'); err = ""; if (_stRegex == null) { _stRegex = new Regex(@"^\s+at\s(.+)\s\((.+\.js):(\d+)\)(.*)$", RegexOptions.Compiled); } for (var i = 0; i < errlines.Length; i++) { var line = errlines[i]; var matches = _stRegex.Matches(line); if (matches.Count == 1) { var match = matches[0]; if (match.Groups.Count >= 4) { var funcName = match.Groups[1].Value; var fileName = match.Groups[2].Value; var lineNumber = 0; int.TryParse(match.Groups[3].Value, out lineNumber); var extra = match.Groups.Count >= 5 ? match.Groups[4].Value : ""; var sroucePosition = duk_source_position(ctx, funcName, fileName, lineNumber); err += $" at {sroucePosition}{extra}\n"; continue; } } err += line + "\n"; } } if (filename != null) { Debug.LogError($"[JSError][{filename}] {err}"); } else { Debug.LogError($"[JSError] {err}"); } }