mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
crash: beforeSend needs to add contexts to the event directly
This commit is contained in:
@ -53,7 +53,7 @@ pub const Value = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// sentry_value_set_by_key_n
|
/// sentry_value_set_by_key_n
|
||||||
pub fn setByKey(self: Value, key: []const u8, value: Value) void {
|
pub fn set(self: Value, key: []const u8, value: Value) void {
|
||||||
_ = c.sentry_value_set_by_key_n(
|
_ = c.sentry_value_set_by_key_n(
|
||||||
self.value,
|
self.value,
|
||||||
key.ptr,
|
key.ptr,
|
||||||
@ -61,4 +61,15 @@ pub const Value = struct {
|
|||||||
value.value,
|
value.value,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// sentry_value_set_by_key_n
|
||||||
|
pub fn get(self: Value, key: []const u8) ?Value {
|
||||||
|
const val: Value = .{ .value = c.sentry_value_get_by_key_n(
|
||||||
|
self.value,
|
||||||
|
key.ptr,
|
||||||
|
key.len,
|
||||||
|
) };
|
||||||
|
if (val.isNull()) return null;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -143,7 +143,19 @@ fn beforeSend(
|
|||||||
// If we don't have thread state we can't reliably determine
|
// If we don't have thread state we can't reliably determine
|
||||||
// metadata such as surface dimensions. In the future we can probably
|
// metadata such as surface dimensions. In the future we can probably
|
||||||
// drop full app state (all surfaces, all windows, etc.).
|
// drop full app state (all surfaces, all windows, etc.).
|
||||||
const thr_state = thread_state orelse return event_val;
|
const thr_state = thread_state orelse {
|
||||||
|
log.debug("no thread state, skipping crash metadata", .{});
|
||||||
|
return event_val;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get our event contexts. At this point Sentry has already merged
|
||||||
|
// all the contexts so we should have this key. If not, we create it.
|
||||||
|
const event: sentry.Value = .{ .value = event_val };
|
||||||
|
const contexts = event.get("contexts") orelse contexts: {
|
||||||
|
const obj = sentry.Value.initObject();
|
||||||
|
event.set("contexts", obj);
|
||||||
|
break :contexts obj;
|
||||||
|
};
|
||||||
|
|
||||||
// Read the surface data. This is likely unsafe because on a crash
|
// Read the surface data. This is likely unsafe because on a crash
|
||||||
// other threads can continue running. We don't have race-safe way to
|
// other threads can continue running. We don't have race-safe way to
|
||||||
@ -152,31 +164,32 @@ fn beforeSend(
|
|||||||
const obj = sentry.Value.initObject();
|
const obj = sentry.Value.initObject();
|
||||||
errdefer obj.decref();
|
errdefer obj.decref();
|
||||||
const surface = thr_state.surface;
|
const surface = thr_state.surface;
|
||||||
obj.setByKey(
|
obj.set(
|
||||||
"screen-width",
|
"screen-width",
|
||||||
sentry.Value.initInt32(std.math.cast(i32, surface.screen_size.width) orelse -1),
|
sentry.Value.initInt32(std.math.cast(i32, surface.screen_size.width) orelse -1),
|
||||||
);
|
);
|
||||||
obj.setByKey(
|
obj.set(
|
||||||
"screen-height",
|
"screen-height",
|
||||||
sentry.Value.initInt32(std.math.cast(i32, surface.screen_size.height) orelse -1),
|
sentry.Value.initInt32(std.math.cast(i32, surface.screen_size.height) orelse -1),
|
||||||
);
|
);
|
||||||
obj.setByKey(
|
obj.set(
|
||||||
"grid-columns",
|
"grid-columns",
|
||||||
sentry.Value.initInt32(std.math.cast(i32, surface.grid_size.columns) orelse -1),
|
sentry.Value.initInt32(std.math.cast(i32, surface.grid_size.columns) orelse -1),
|
||||||
);
|
);
|
||||||
obj.setByKey(
|
obj.set(
|
||||||
"grid-rows",
|
"grid-rows",
|
||||||
sentry.Value.initInt32(std.math.cast(i32, surface.grid_size.rows) orelse -1),
|
sentry.Value.initInt32(std.math.cast(i32, surface.grid_size.rows) orelse -1),
|
||||||
);
|
);
|
||||||
obj.setByKey(
|
obj.set(
|
||||||
"cell-width",
|
"cell-width",
|
||||||
sentry.Value.initInt32(std.math.cast(i32, surface.cell_size.width) orelse -1),
|
sentry.Value.initInt32(std.math.cast(i32, surface.cell_size.width) orelse -1),
|
||||||
);
|
);
|
||||||
obj.setByKey(
|
obj.set(
|
||||||
"cell-height",
|
"cell-height",
|
||||||
sentry.Value.initInt32(std.math.cast(i32, surface.cell_size.height) orelse -1),
|
sentry.Value.initInt32(std.math.cast(i32, surface.cell_size.height) orelse -1),
|
||||||
);
|
);
|
||||||
sentry.setContext("dimensions", obj);
|
|
||||||
|
contexts.set("dimensions", obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return event_val;
|
return event_val;
|
||||||
|
Reference in New Issue
Block a user