Skip to content

Commit 0784ef6

Browse files
feat(EXC-1715): Canister Backtrace Flag (#1291)
Add a feature flag to enable canister backtraces. Follow up PRs will use this flag and actually collect the backtraces.
1 parent 86b5a80 commit 0784ef6

File tree

9 files changed

+21
-0
lines changed

9 files changed

+21
-0
lines changed

rs/config/src/embedders.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ pub struct FeatureFlags {
108108
// TODO(IC-1674): remove this flag once the feature is enabled by default.
109109
/// Indicates whether the best-effort responses feature is enabled.
110110
pub best_effort_responses: FlagStatus,
111+
/// Collect a backtrace from the canister when it panics.
112+
pub canister_backtrace: FlagStatus,
111113
}
112114

113115
impl FeatureFlags {
@@ -118,6 +120,7 @@ impl FeatureFlags {
118120
wasm_native_stable_memory: FlagStatus::Enabled,
119121
wasm64: FlagStatus::Disabled,
120122
best_effort_responses: FlagStatus::Disabled,
123+
canister_backtrace: FlagStatus::Disabled,
121124
}
122125
}
123126
}

rs/embedders/src/wasm_executor.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@ pub fn process(
594594
execution_parameters.clone(),
595595
subnet_available_memory,
596596
embedder.config().feature_flags.wasm_native_stable_memory,
597+
embedder.config().feature_flags.canister_backtrace,
597598
embedder.config().max_sum_exported_function_name_lengths,
598599
stable_memory.clone(),
599600
out_of_instructions_handler,

rs/embedders/src/wasmtime_embedder.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@ impl WasmtimeEmbedder {
516516
store,
517517
write_barrier: self.config.feature_flags.write_barrier,
518518
wasm_native_stable_memory: self.config.feature_flags.wasm_native_stable_memory,
519+
canister_backtrace: self.config.feature_flags.canister_backtrace,
519520
modification_tracking,
520521
dirty_page_overhead: self.config.dirty_page_overhead,
521522
#[cfg(debug_assertions)]
@@ -763,6 +764,8 @@ pub struct WasmtimeInstance {
763764
store: wasmtime::Store<StoreData>,
764765
write_barrier: FlagStatus,
765766
wasm_native_stable_memory: FlagStatus,
767+
#[allow(unused)]
768+
canister_backtrace: FlagStatus,
766769
modification_tracking: ModificationTracking,
767770
dirty_page_overhead: NumInstructions,
768771
#[cfg(debug_assertions)]

rs/embedders/src/wasmtime_embedder/wasmtime_embedder_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ fn test_wasmtime_system_api() {
8989
EmbeddersConfig::default()
9090
.feature_flags
9191
.wasm_native_stable_memory,
92+
EmbeddersConfig::default().feature_flags.canister_backtrace,
9293
EmbeddersConfig::default().max_sum_exported_function_name_lengths,
9394
Memory::new_for_testing(),
9495
Rc::new(DefaultOutOfInstructionsHandler::default()),

rs/embedders/tests/wasmtime_random_memory_writes.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ fn test_api_for_update(
108108
EmbeddersConfig::default()
109109
.feature_flags
110110
.wasm_native_stable_memory,
111+
EmbeddersConfig::default().feature_flags.canister_backtrace,
111112
EmbeddersConfig::default().max_sum_exported_function_name_lengths,
112113
Memory::new_for_testing(),
113114
Rc::new(DefaultOutOfInstructionsHandler::new(instruction_limit)),

rs/system_api/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,11 @@ pub struct SystemApiImpl {
961961
/// still be read through the hidden read API for speed on the first access.
962962
wasm_native_stable_memory: FlagStatus,
963963

964+
/// Canister backtraces are enabled. This means we should attempt to collect
965+
/// a backtrace if the canister calls the trap API.
966+
#[allow(unused)]
967+
canister_backtrace: FlagStatus,
968+
964969
/// The maximum sum of `<name>` lengths in exported functions called `canister_update <name>`,
965970
/// `canister_query <name>`, or `canister_composite_query <name>`.
966971
max_sum_exported_function_name_lengths: usize,
@@ -1003,6 +1008,7 @@ impl SystemApiImpl {
10031008
execution_parameters: ExecutionParameters,
10041009
subnet_available_memory: SubnetAvailableMemory,
10051010
wasm_native_stable_memory: FlagStatus,
1011+
canister_backtrace: FlagStatus,
10061012
max_sum_exported_function_name_lengths: usize,
10071013
stable_memory: Memory,
10081014
out_of_instructions_handler: Rc<dyn OutOfInstructionsHandler>,
@@ -1026,6 +1032,7 @@ impl SystemApiImpl {
10261032
memory_usage,
10271033
execution_parameters,
10281034
wasm_native_stable_memory,
1035+
canister_backtrace,
10291036
max_sum_exported_function_name_lengths,
10301037
stable_memory,
10311038
sandbox_safe_system_state,

rs/system_api/tests/common/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ pub fn get_system_api(
205205
EmbeddersConfig::default()
206206
.feature_flags
207207
.wasm_native_stable_memory,
208+
EmbeddersConfig::default().feature_flags.canister_backtrace,
208209
EmbeddersConfig::default().max_sum_exported_function_name_lengths,
209210
Memory::new_for_testing(),
210211
Rc::new(DefaultOutOfInstructionsHandler::default()),

rs/system_api/tests/system_api.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,7 @@ fn growing_wasm_memory_updates_subnet_available_memory() {
13431343
EmbeddersConfig::default()
13441344
.feature_flags
13451345
.wasm_native_stable_memory,
1346+
EmbeddersConfig::default().feature_flags.canister_backtrace,
13461347
EmbeddersConfig::default().max_sum_exported_function_name_lengths,
13471348
Memory::new_for_testing(),
13481349
Rc::new(DefaultOutOfInstructionsHandler::default()),
@@ -1415,6 +1416,7 @@ fn push_output_request_respects_memory_limits() {
14151416
EmbeddersConfig::default()
14161417
.feature_flags
14171418
.wasm_native_stable_memory,
1419+
EmbeddersConfig::default().feature_flags.canister_backtrace,
14181420
EmbeddersConfig::default().max_sum_exported_function_name_lengths,
14191421
Memory::new_for_testing(),
14201422
Rc::new(DefaultOutOfInstructionsHandler::default()),
@@ -1526,6 +1528,7 @@ fn push_output_request_oversized_request_memory_limits() {
15261528
EmbeddersConfig::default()
15271529
.feature_flags
15281530
.wasm_native_stable_memory,
1531+
EmbeddersConfig::default().feature_flags.canister_backtrace,
15291532
EmbeddersConfig::default().max_sum_exported_function_name_lengths,
15301533
Memory::new_for_testing(),
15311534
Rc::new(DefaultOutOfInstructionsHandler::default()),

rs/test_utilities/embedders/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ impl WasmtimeInstanceBuilder {
164164
subnet_memory_capacity,
165165
),
166166
embedder.config().feature_flags.wasm_native_stable_memory,
167+
embedder.config().feature_flags.canister_backtrace,
167168
embedder.config().max_sum_exported_function_name_lengths,
168169
Memory::new_for_testing(),
169170
Rc::new(ic_system_api::DefaultOutOfInstructionsHandler::new(

0 commit comments

Comments
 (0)