diff options
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/bindings/exports.zig | 2 | ||||
-rw-r--r-- | src/bun.js/bindings/wtf-bindings.cpp | 34 | ||||
-rw-r--r-- | src/bun.js/module_loader.zig | 1 |
3 files changed, 36 insertions, 1 deletions
diff --git a/src/bun.js/bindings/exports.zig b/src/bun.js/bindings/exports.zig index e6ccc039e..2e2c5e556 100644 --- a/src/bun.js/bindings/exports.zig +++ b/src/bun.js/bindings/exports.zig @@ -26,7 +26,7 @@ const JSModuleLoader = JSC.JSModuleLoader; const JSModuleRecord = JSC.JSModuleRecord; const Microtask = JSC.Microtask; const JSPrivateDataPtr = @import("../base.zig").JSPrivateDataPtr; -const Backtrace = @import("../../deps/backtrace.zig"); +const Backtrace = @import("../../crash_reporter.zig"); const JSPrinter = @import("../../js_printer.zig"); const JSLexer = @import("../../js_lexer.zig"); const typeBaseName = @import("../../meta.zig").typeBaseName; diff --git a/src/bun.js/bindings/wtf-bindings.cpp b/src/bun.js/bindings/wtf-bindings.cpp index 561c83ffa..d1d73a891 100644 --- a/src/bun.js/bindings/wtf-bindings.cpp +++ b/src/bun.js/bindings/wtf-bindings.cpp @@ -1,6 +1,8 @@ #include "wtf-bindings.h" #include "wtf/text/Base64.h" +#include "wtf/StackTrace.h" + extern "C" void WTF__copyLCharsFromUCharSource(LChar* destination, const UChar* source, size_t length) { WTF::StringImpl::copyCharacters(destination, source, length); @@ -11,4 +13,36 @@ extern "C" JSC::EncodedJSValue WTF__toBase64URLStringValue(const uint8_t* bytes, WTF::String string = WTF::base64URLEncodeToString(reinterpret_cast<const LChar*>(bytes), static_cast<unsigned int>(length)); string.impl()->ref(); return JSC::JSValue::encode(JSC::jsString(globalObject->vm(), string)); +} + +extern "C" void Bun__crashReportWrite(void* ctx, const char* message, size_t length); +extern "C" void Bun__crashReportDumpStackTrace(void* ctx) +{ + static constexpr int framesToShow = 32; + static constexpr int framesToSkip = 4; + void* stack[framesToShow + framesToSkip]; + int frames = framesToShow + framesToSkip; + WTFGetBacktrace(stack, &frames); + bool isFirst = true; + WTF::StackTraceSymbolResolver { { stack, static_cast<size_t>(frames) } }.forEach([&](int frameNumber, void* stackFrame, const char* name) { + if (frameNumber < framesToSkip) + return; + + StringPrintStream out; + if (isFirst) { + isFirst = false; + if (name) + out.printf("\n%-3d %p %s", frameNumber, stackFrame, name); + else + out.printf("\n%-3d %p", frameNumber, stackFrame); + } else { + if (name) + out.printf("%-3d %p %s", frameNumber, stackFrame, name); + else + out.printf("%-3d %p", frameNumber, stackFrame); + } + + auto str = out.toCString(); + Bun__crashReportWrite(ctx, str.data(), str.length()); + }); }
\ No newline at end of file diff --git a/src/bun.js/module_loader.zig b/src/bun.js/module_loader.zig index 82e96c8ed..59a4288fb 100644 --- a/src/bun.js/module_loader.zig +++ b/src/bun.js/module_loader.zig @@ -1357,6 +1357,7 @@ pub const ModuleLoader = struct { if (err == error.AsyncModule) { unreachable; } + VirtualMachine.processFetchLog(globalObject, specifier.*, referrer.*, &log, ret, err); return true; }) |builtin| { |