diff options
Diffstat (limited to 'src/deps')
-rw-r--r-- | src/deps/PLCrashReport.bindings.h | 10 | ||||
-rw-r--r-- | src/deps/PLCrashReport.m | 74 | ||||
-rw-r--r-- | src/deps/PLCrashReport.zig | 42 | ||||
-rw-r--r-- | src/deps/backtrace.zig | 159 | ||||
m--------- | src/deps/libbacktrace | 0 | ||||
m--------- | src/deps/mimalloc | 0 |
6 files changed, 159 insertions, 126 deletions
diff --git a/src/deps/PLCrashReport.bindings.h b/src/deps/PLCrashReport.bindings.h deleted file mode 100644 index 2fbfc9bac..000000000 --- a/src/deps/PLCrashReport.bindings.h +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdbool.h> -#include <stdint.h> - -extern bool PLCrashReportStart(const char *version, const char *basePath); -extern void PLCrashReportHandler(void *context); - -extern void PLCrashReportGenerate(); -extern void *PLCrashReportLoadPending(); - -extern uint16_t copyCrashReportPath(char *buf[1024]); diff --git a/src/deps/PLCrashReport.m b/src/deps/PLCrashReport.m deleted file mode 100644 index ecd099424..000000000 --- a/src/deps/PLCrashReport.m +++ /dev/null @@ -1,74 +0,0 @@ -#include "PLCrashReport.bindings.h" - -#include <PLCrashReporter/PLCrashReporter.h> - -NSString *crash_folder; - -@interface PLCrashReporter (PrivateMethods) - -- (id)initWithApplicationIdentifier:(NSString *)applicationIdentifier - appVersion:(NSString *)applicationVersion - appMarketingVersion:(NSString *)applicationMarketingVersion - configuration:(PLCrashReporterConfig *)configuration; - -@end - -void pl_crash_reporter_post_crash_callback(siginfo_t *info, ucontext_t *uap, - void *context) { - PLCrashReportHandler(context); -} - -static PLCrashReporter *reporter; - -NSString *v; -NSString *basePath_; -static void *handler; -bool PLCrashReportStart(const char *version, const char *basePath) { - PLCrashReporterConfig *config; - basePath_ = [NSString stringWithUTF8String:basePath]; - - handler = &pl_crash_reporter_post_crash_callback; - PLCrashReporterCallbacks callbacks = { - .version = 0, .context = NULL, .handleSignal = handler}; - config = [[PLCrashReporterConfig alloc] - initWithSignalHandlerType:PLCrashReporterSignalHandlerTypeBSD - symbolicationStrategy: - PLCrashReporterSymbolicationStrategyNone - shouldRegisterUncaughtExceptionHandler:YES - basePath:basePath_]; - - v = [[NSString alloc] initWithBytesNoCopy:version - length:strlen(version) - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - reporter = [[PLCrashReporter alloc] initWithApplicationIdentifier:@"bun" - appVersion:v - appMarketingVersion:v - configuration:config]; - - [reporter setValue:basePath_ forKey:@"_crashReportDirectory"]; - [reporter setCrashCallbacks:&callbacks]; - - return [reporter enableCrashReporter]; -} - -void PLCrashReportGenerate() { [reporter generateLiveReport]; } -void *PLCrashReportLoadPending() { - return [reporter loadPendingCrashReportData]; -} - -uint16_t copyCrashReportPath(char *buf[1024]) { - NSString *crashReportPath = [reporter crashReportPath]; - [crashReportPath getBytes:buf - maxLength:(1024 - 1) - usedLength:NULL - encoding:NSUTF8StringEncoding - options:0 - range:NSMakeRange(0, [crashReportPath length]) - remainingRange:NULL]; - size_t len = [crashReportPath length]; - if (len > 1024) { - len = 0; - } - return (uint16_t)len; -} diff --git a/src/deps/PLCrashReport.zig b/src/deps/PLCrashReport.zig deleted file mode 100644 index 9625cf441..000000000 --- a/src/deps/PLCrashReport.zig +++ /dev/null @@ -1,42 +0,0 @@ -const root = @import("root"); -const std = @import("std"); - -extern fn PLCrashReportStart(version: [*:0]const u8, base_path: [*:0]const u8) bool; -extern fn PLCrashReportGenerate() void; -extern fn PLCrashReportLoadPending() ?*anyopaque; -extern fn copyCrashReportPath(buf: *[1024]u8) u16; - -pub export fn PLCrashReportHandler(_: ?*anyopaque) void { - root.PLCrashReportHandler(); -} - -pub fn start( - comptime version: [*:0]const u8, -) bool { - has_started = true; - var base_path_buf: [1024]u8 = undefined; - var base_path: [:0]const u8 = ""; - const crash_path = "/crash/" ++ version ++ "/"; - if (std.os.getenvZ("BUN_INSTALL")) |bun_install| { - @memcpy(&base_path_buf, bun_install.ptr, bun_install.len); - std.mem.copy(u8, base_path_buf[bun_install.len..], crash_path); - base_path_buf[bun_install.len + crash_path.len] = 0; - base_path = base_path_buf[0 .. bun_install.len + crash_path.len :0]; - } else { - base_path = "/tmp/bun" ++ crash_path; - base_path_buf["/tmp/bun".len + crash_path.len] = 0; - } - return PLCrashReportStart(version, base_path.ptr); -} - -pub fn generate() void { - return PLCrashReportGenerate(); -} -var has_started = false; - -pub fn crashReportPath(buf: *[1024]u8) []const u8 { - if (!has_started) return ""; - - const len = copyCrashReportPath(buf); - return buf[0..len]; -} diff --git a/src/deps/backtrace.zig b/src/deps/backtrace.zig new file mode 100644 index 000000000..8448642de --- /dev/null +++ b/src/deps/backtrace.zig @@ -0,0 +1,159 @@ +pub const backtrace_state = struct_backtrace_state; +pub const struct_backtrace_state = opaque {}; +pub const backtrace_error_callback = ?fn ( + ?*anyopaque, + [*c]const u8, + c_int, +) callconv(.C) void; +pub extern fn backtrace_create_state( + filename: [*c]const u8, + threaded: c_int, + error_callback: backtrace_error_callback, + data: ?*anyopaque, +) ?*struct_backtrace_state; +pub const backtrace_full_callback = ?fn ( + ?*anyopaque, + usize, + [*c]const u8, + c_int, + [*c]const u8, +) callconv(.C) c_int; +pub extern fn backtrace_full( + state: ?*struct_backtrace_state, + skip: c_int, + callback: backtrace_full_callback, + error_callback: backtrace_error_callback, + data: ?*anyopaque, +) c_int; +pub const backtrace_simple_callback = ?fn (?*anyopaque, usize) callconv(.C) c_int; +pub extern fn backtrace_simple( + state: ?*struct_backtrace_state, + skip: c_int, + callback: backtrace_simple_callback, + error_callback: backtrace_error_callback, + data: ?*anyopaque, +) c_int; +pub extern fn backtrace_print(state: ?*struct_backtrace_state, skip: c_int, [*c]anyopaque) void; +pub extern fn backtrace_pcinfo( + state: ?*struct_backtrace_state, + pc: usize, + callback: backtrace_full_callback, + error_callback: backtrace_error_callback, + data: ?*anyopaque, +) c_int; +pub const backtrace_syminfo_callback = ?fn (?*anyopaque, usize, [*c]const u8, usize, usize) callconv(.C) void; +pub extern fn backtrace_syminfo( + state: ?*struct_backtrace_state, + addr: usize, + callback: backtrace_syminfo_callback, + error_callback: backtrace_error_callback, + data: ?*anyopaque, +) c_int; + +pub const BACKTRACE_SUPPORTED = @as(c_int, 1); +pub const BACKTRACE_USES_MALLOC = @as(c_int, 0); +pub const BACKTRACE_SUPPORTS_THREADS = @as(c_int, 1); +pub const BACKTRACE_SUPPORTS_DATA = @as(c_int, 1); + +fn error_callback(data: *anyopaque, msg: [*c]u8, errnum: c_int) callconv(.C) void { + _ = data; + _ = msg; + _ = errnum; +} + +pub const StackFrame = struct { + pc: usize, + filename: []const u8, + function_name: []const u8, + line_number: c_int, +}; + +pub const PrintCallback = fn (ctx: ?*anyopaque, frame: StackFrame) void; + +var callback: PrintCallback = undefined; +var callback_ctx: ?*anyopaque = null; + +const std = @import("std"); + +noinline fn full_callback(_: ?*anyopaque, pc: usize, filename: [*c]const u8, line_number: c_int, function_name: [*c]const u8) callconv(.C) c_int { + var stack_frame = StackFrame{ + .pc = pc, + .line_number = line_number, + .function_name = if (function_name) |fn_| std.mem.span(fn_) else "", + .filename = if (filename) |fn_| std.mem.span(fn_) else "", + }; + callback(callback_ctx, stack_frame); + return 0; +} + +var state: ?*backtrace_state = null; +pub inline fn print() void { + state = backtrace_create_state(null, BACKTRACE_SUPPORTS_THREADS, null, null); + _ = backtrace_full(state, 2, full_callback, null, null); +} + +const builtin = @import("builtin"); +const ErrorCallback = fn (sig: i32, addr: usize) void; +var on_error: ?ErrorCallback = null; +noinline fn sigaction_handler(sig: i32, info: *const std.os.siginfo_t, _: ?*const anyopaque) callconv(.C) void { + // Prevent recursive calls + os.sigaction(os.SIG.ABRT, null, null); + os.sigaction(os.SIG.BUS, null, null); + os.sigaction(os.SIG.FPE, null, null); + os.sigaction(os.SIG.ILL, null, null); + os.sigaction(os.SIG.SEGV, null, null); + os.sigaction(os.SIG.TRAP, null, null); + + const addr = switch (comptime builtin.target.os.tag) { + .linux => @ptrToInt(info.fields.sigfault.addr), + .macos, .freebsd => @ptrToInt(info.addr), + .netbsd => @ptrToInt(info.info.reason.fault.addr), + .openbsd => @ptrToInt(info.data.fault.addr), + .solaris => @ptrToInt(info.reason.fault.addr), + else => unreachable, + }; + if (on_error) |handle| handle(sig, addr); +} + +pub fn reloadHandlers() void { + os.sigaction(os.SIG.ABRT, null, null); + os.sigaction(os.SIG.BUS, null, null); + os.sigaction(os.SIG.FPE, null, null); + os.sigaction(os.SIG.ILL, null, null); + os.sigaction(os.SIG.SEGV, null, null); + os.sigaction(os.SIG.TRAP, null, null); + + var act = os.Sigaction{ + .handler = .{ .sigaction = sigaction_handler }, + .mask = os.empty_sigset, + .flags = (os.SA.SIGINFO | os.SA.RESTART | os.SA.RESETHAND), + }; + + os.sigaction(os.SIG.ABRT, &act, null); + os.sigaction(os.SIG.BUS, &act, null); + os.sigaction(os.SIG.FPE, &act, null); + os.sigaction(os.SIG.ILL, &act, null); + os.sigaction(os.SIG.SEGV, &act, null); + os.sigaction(os.SIG.TRAP, &act, null); +} +const os = std.os; +pub fn start(ctx: ?*anyopaque, callback_: PrintCallback, onError: ErrorCallback) bool { + callback_ctx = ctx; + callback = callback_; + on_error = onError; + + var act = os.Sigaction{ + .handler = .{ .sigaction = sigaction_handler }, + .mask = os.empty_sigset, + .flags = (os.SA.SIGINFO | os.SA.RESTART | os.SA.RESETHAND), + }; + + os.sigaction(os.SIG.ABRT, &act, null); + os.sigaction(os.SIG.BUS, &act, null); + os.sigaction(os.SIG.FPE, &act, null); + os.sigaction(os.SIG.ILL, &act, null); + os.sigaction(os.SIG.SEGV, &act, null); + os.sigaction(os.SIG.TRAP, &act, null); + + return true; +} diff --git a/src/deps/libbacktrace b/src/deps/libbacktrace new file mode 160000 +Subproject d0f5e95a87a4d3e0a1ed6c069b5dae7cbab3ed2 diff --git a/src/deps/mimalloc b/src/deps/mimalloc -Subproject f412df7a2b64421e1f1d61fde6055a6ea288e8f +Subproject d2e727f0e871cd35305bdb7bc3983cf60744175 |