From 559f760d5fd891a4221d37a3e26fd82c65d29f41 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 30 Mar 2026 15:25:26 +0200 Subject: [PATCH 01/10] WIP --- .../src/symbolication/process_minidump.rs | 118 +++++++++++++++++- .../src/symbolication/symbolicate.rs | 2 +- 2 files changed, 115 insertions(+), 5 deletions(-) diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index 9a7e0f031..5235db963 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -24,6 +24,8 @@ use symbolicator_sources::{ObjectId, ObjectType, SourceConfig}; use tokio::sync::Notify; use crate::caches::cficaches::{CfiCacheActor, CfiModuleInfo, FetchCfiCache, FetchedCfiCache}; +use crate::caches::derived::DerivedCache; +use crate::caches::symcaches::{FetchSymCache, OwnedSymCache, SymCacheActor}; use crate::interface::{ CompleteObjectInfo, CompletedSymbolicationResponse, ProcessMinidump, RawFrame, RawStacktrace, Registers, RewriteRules, SymbolicateStacktraces, SystemInfo, @@ -138,11 +140,14 @@ impl LookupKey { } #[derive(Clone)] -enum LazyCfiCache { - Fetched(Arc), +enum LazyCache { + Fetched(Arc), Fetching(Arc), } +type LazyCfiCache = LazyCache; +type LazySymCache = LazyCache>; + /// A [`SymbolProvider`] that uses a [`CfiCacheActor`] to fetch /// CFI for stackwalking. /// @@ -156,6 +161,7 @@ struct SymbolicatorSymbolProvider { object_type: ObjectType, /// The actor used for fetching CFI. cficache_actor: CfiCacheActor, + symcache_actor: SymCacheActor, /// The debug ID of the first module in the minidump /// (by address). /// @@ -170,6 +176,8 @@ struct SymbolicatorSymbolProvider { rewrite_first_module: RewriteRules, /// An internal database of loaded CFI. cficaches: Mutex>, + /// An internal database of loaded symcaches. + symcaches: Mutex>, } impl SymbolicatorSymbolProvider { @@ -177,6 +185,7 @@ impl SymbolicatorSymbolProvider { scope: Scope, sources: Arc<[SourceConfig]>, cficache_actor: CfiCacheActor, + symcache_actor: SymCacheActor, object_type: ObjectType, first_module_debug_id: Option, rewrite_first_module: RewriteRules, @@ -185,10 +194,12 @@ impl SymbolicatorSymbolProvider { scope, sources, cficache_actor, + symcache_actor, object_type, first_module_debug_id, rewrite_first_module, cficaches: Default::default(), + symcaches: Default::default(), } } @@ -266,6 +277,84 @@ impl SymbolicatorSymbolProvider { } cficache } + + /// Fetches CFI for the given module, parses it into a `SymbolFile`, and stores it internally. + async fn load_symcache_module( + &self, + module: &(dyn Module + Sync), + ) -> Arc> { + let key = LookupKey::new(module); + + loop { + // FIXME: ideally, we would like to only lock once here, but the borrow checker does not + // understand that `drop()`-ing the guard before the `notified().await` does not hold + // the guard across an `await` point. + // Currently, it still thinks it does, and makes the resulting future `!Send`. + // We will therefore double-lock again in the `None` branch. + let entry = self.symcaches.lock().unwrap().get(&key).cloned(); + match entry { + Some(LazySymCache::Fetched(symcache)) => return symcache, + Some(LazySymCache::Fetching(notify)) => { + // unlock, wait and then try again + notify.notified().await; + } + None => { + // insert a notifier for concurrent accesses, then go on to actually fetch + let mut symcaches = self.symcaches.lock().unwrap(); + symcaches.insert(key.clone(), LazySymCache::Fetching(Arc::new(Notify::new()))); + break; + } + } + } + + let sources = self.sources.clone(); + let scope = self.scope.clone(); + + let code_file = non_empty_file_name(&module.code_file()); + let mut debug_file = module.debug_file().as_deref().and_then(non_empty_file_name); + + // Rewrite the first module's debug file according to the configured rewrite rules. + if module.debug_identifier() == self.first_module_debug_id + && let Some(new_debug_file) = debug_file + .as_ref() + .and_then(|debug_file| self.rewrite_first_module.rewrite(debug_file)) + { + debug_file = Some(new_debug_file); + } + + let identifier = ObjectId { + code_id: module.code_identifier(), + code_file, + debug_id: module.debug_identifier(), + debug_file, + debug_checksum: None, + object_type: self.object_type, + }; + + let symcache = self + .symcache_actor + .fetch(FetchSymCache { + object_type: self.object_type, + identifier, + sources, + scope, + }) + // NOTE: this `bind_hub` is important! + // `load_symcache_module` is being called concurrently from `rust-minidump` via + // `join_all`. We do need proper isolation of any async task that might + // manipulate any Sentry scope. + .bind_hub(Hub::new_from_top(Hub::current())) + .await; + + let symcache = Arc::new(symcache); + let mut symcaches = self.symcaches.lock().unwrap(); + if let Some(LazySymCache::Fetching(notify)) = + symcaches.insert(key, LazySymCache::Fetched(symcache.clone())) + { + notify.notify_waiters(); + } + symcache + } } #[async_trait] @@ -275,6 +364,9 @@ impl SymbolProvider for SymbolicatorSymbolProvider { module: &(dyn Module + Sync), frame: &mut (dyn FrameSymbolizer + Send), ) -> Result<(), FillSymbolError> { + let mut valid_by_cfi = true; + let mut valid_by_symbol_info = true; + // This function is being called for every context frame, // regardless if any stack walking happens. // In contrast, `walk_frame` below will be skipped in case the minidump @@ -304,13 +396,28 @@ impl SymbolProvider for SymbolicatorSymbolProvider { if !cfi.is_empty() && cfi.get(instruction).is_none() { // We definitely do have CFI information loaded, but the given instruction does not // map to any stack frame info. - return Ok(()); + valid_by_cfi = false; + } + } + + let symcache_module = self.load_symcache_module(module).await; + if let Ok(cached) = &symcache_module.cache { + let instruction = frame.get_instruction() - module.base_address(); + + if cached.get().lookup(instruction).next().is_none() { + // We definitely do have symbol information loaded, but the given instruction does not + // map to any symbol info. + valid_by_symbol_info = false; } } // In any other case, always return an error here to signal that we have no useful symbol information to // contribute. Doing nothing would stop the stack scanning prematurely. - Err(FillSymbolError {}) + if valid_by_cfi || valid_by_symbol_info { + Err(FillSymbolError {}) + } else { + Ok(()) + } } async fn walk_frame( @@ -359,6 +466,7 @@ fn object_info_from_minidump_module(ty: ObjectType, module: &MinidumpModule) -> async fn stackwalk( cficaches: CfiCacheActor, + symcaches: SymCacheActor, minidump: &Minidump, scope: Scope, sources: Arc<[SourceConfig]>, @@ -387,6 +495,7 @@ async fn stackwalk( scope, sources, cficaches, + symcaches, ty, first_module_debug_id, rewrite_first_module, @@ -540,6 +649,7 @@ impl SymbolicationActor { duration, } = stackwalk( self.cficaches.clone(), + self.symcaches.clone(), &minidump, scope.clone(), sources.clone(), diff --git a/crates/symbolicator-native/src/symbolication/symbolicate.rs b/crates/symbolicator-native/src/symbolication/symbolicate.rs index 7b3b35a2f..49711cd60 100644 --- a/crates/symbolicator-native/src/symbolication/symbolicate.rs +++ b/crates/symbolicator-native/src/symbolication/symbolicate.rs @@ -32,7 +32,7 @@ use super::native::{get_relative_caller_addr, symbolicate_native_frame}; pub struct SymbolicationActor { demangle_cache: DemangleCache, pub(crate) objects: ObjectsActor, - symcaches: SymCacheActor, + pub(crate) symcaches: SymCacheActor, pub(crate) cficaches: CfiCacheActor, ppdb_caches: PortablePdbCacheActor, pub(crate) sourcefiles_cache: Arc, From 336d94660c152d5a68f4b3bb7260af85b849c97d Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 30 Mar 2026 15:34:01 +0200 Subject: [PATCH 02/10] Remove local symaches map --- .../src/symbolication/process_minidump.rs | 50 ++----------------- 1 file changed, 5 insertions(+), 45 deletions(-) diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index 5235db963..b359d8a0c 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -140,14 +140,11 @@ impl LookupKey { } #[derive(Clone)] -enum LazyCache { - Fetched(Arc), +enum LazyCfiCache { + Fetched(Arc), Fetching(Arc), } -type LazyCfiCache = LazyCache; -type LazySymCache = LazyCache>; - /// A [`SymbolProvider`] that uses a [`CfiCacheActor`] to fetch /// CFI for stackwalking. /// @@ -176,8 +173,6 @@ struct SymbolicatorSymbolProvider { rewrite_first_module: RewriteRules, /// An internal database of loaded CFI. cficaches: Mutex>, - /// An internal database of loaded symcaches. - symcaches: Mutex>, } impl SymbolicatorSymbolProvider { @@ -199,7 +194,6 @@ impl SymbolicatorSymbolProvider { first_module_debug_id, rewrite_first_module, cficaches: Default::default(), - symcaches: Default::default(), } } @@ -282,31 +276,7 @@ impl SymbolicatorSymbolProvider { async fn load_symcache_module( &self, module: &(dyn Module + Sync), - ) -> Arc> { - let key = LookupKey::new(module); - - loop { - // FIXME: ideally, we would like to only lock once here, but the borrow checker does not - // understand that `drop()`-ing the guard before the `notified().await` does not hold - // the guard across an `await` point. - // Currently, it still thinks it does, and makes the resulting future `!Send`. - // We will therefore double-lock again in the `None` branch. - let entry = self.symcaches.lock().unwrap().get(&key).cloned(); - match entry { - Some(LazySymCache::Fetched(symcache)) => return symcache, - Some(LazySymCache::Fetching(notify)) => { - // unlock, wait and then try again - notify.notified().await; - } - None => { - // insert a notifier for concurrent accesses, then go on to actually fetch - let mut symcaches = self.symcaches.lock().unwrap(); - symcaches.insert(key.clone(), LazySymCache::Fetching(Arc::new(Notify::new()))); - break; - } - } - } - + ) -> DerivedCache { let sources = self.sources.clone(); let scope = self.scope.clone(); @@ -331,8 +301,7 @@ impl SymbolicatorSymbolProvider { object_type: self.object_type, }; - let symcache = self - .symcache_actor + self.symcache_actor .fetch(FetchSymCache { object_type: self.object_type, identifier, @@ -344,16 +313,7 @@ impl SymbolicatorSymbolProvider { // `join_all`. We do need proper isolation of any async task that might // manipulate any Sentry scope. .bind_hub(Hub::new_from_top(Hub::current())) - .await; - - let symcache = Arc::new(symcache); - let mut symcaches = self.symcaches.lock().unwrap(); - if let Some(LazySymCache::Fetching(notify)) = - symcaches.insert(key, LazySymCache::Fetched(symcache.clone())) - { - notify.notify_waiters(); - } - symcache + .await } } From 8678028941ccb1566ebde061e79e2fb994800270 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 30 Mar 2026 15:50:10 +0200 Subject: [PATCH 03/10] docs --- .../src/symbolication/process_minidump.rs | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index b359d8a0c..aaa672730 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -158,6 +158,12 @@ struct SymbolicatorSymbolProvider { object_type: ObjectType, /// The actor used for fetching CFI. cficache_actor: CfiCacheActor, + /// The actor used for fetching symcaches. + /// + /// Note that debug information is currently _not_ used to symbolicate frames + /// during stackwalking (which `rust-minidump` supports in principle). Rather, + /// we use it as a sanity check for `rust-minidump`'s stackwalker. See the + /// implementation of `fill_symbol` for details. symcache_actor: SymCacheActor, /// The debug ID of the first module in the minidump /// (by address). @@ -272,11 +278,8 @@ impl SymbolicatorSymbolProvider { cficache } - /// Fetches CFI for the given module, parses it into a `SymbolFile`, and stores it internally. - async fn load_symcache_module( - &self, - module: &(dyn Module + Sync), - ) -> DerivedCache { + /// Fetches debug info for the given module and parses it into a `SymCache`. + async fn load_symcache(&self, module: &(dyn Module + Sync)) -> DerivedCache { let sources = self.sources.clone(); let scope = self.scope.clone(); @@ -309,7 +312,7 @@ impl SymbolicatorSymbolProvider { scope, }) // NOTE: this `bind_hub` is important! - // `load_symcache_module` is being called concurrently from `rust-minidump` via + // `load_symcache` is being called concurrently from `rust-minidump` via // `join_all`. We do need proper isolation of any async task that might // manipulate any Sentry scope. .bind_hub(Hub::new_from_top(Hub::current())) @@ -324,6 +327,8 @@ impl SymbolProvider for SymbolicatorSymbolProvider { module: &(dyn Module + Sync), frame: &mut (dyn FrameSymbolizer + Send), ) -> Result<(), FillSymbolError> { + // By default we assume that neither CFI nor symbol info give us reason + // to reject the frame. let mut valid_by_cfi = true; let mut valid_by_symbol_info = true; @@ -338,15 +343,10 @@ impl SymbolProvider for SymbolicatorSymbolProvider { // Try to validate the given instruction against the CFI module contents. // // This helps the `rust-minidump`'s stack-walker to make better decisions. - // Returning an error here will aggressively create frames. - // To indicate a that a potential instruction is not valid, we can return success - // here but also not fill in the symbol name. - // // If the successfully loaded CFI unwind info can not find the potential instruction // the passed instruction is most likely not a valid instruction from this module. // But since the instruction maps into the range of this module, we know it cannot // be part of a different module either -> it's not a valid instruction. - // Returning success in this case, means the frame will be skipped. // // See: https://github.com/rust-minidump/rust-minidump/blob/32e01a0e54d987025aa64486ebc4154f7f6b16d2/minidump-unwind/src/lib.rs#L865-L877 if let Ok(Some(cached)) = &cfi_module.cache { @@ -360,7 +360,9 @@ impl SymbolProvider for SymbolicatorSymbolProvider { } } - let symcache_module = self.load_symcache_module(module).await; + let symcache_module = self.load_symcache(module).await; + + // As above, but with symbol/debug information this time. if let Ok(cached) = &symcache_module.cache { let instruction = frame.get_instruction() - module.base_address(); @@ -371,11 +373,14 @@ impl SymbolProvider for SymbolicatorSymbolProvider { } } - // In any other case, always return an error here to signal that we have no useful symbol information to - // contribute. Doing nothing would stop the stack scanning prematurely. + // If neither CFI nor symbol info reject the frame, return an error here to signal that + // we have no useful symbol information to contribute. Doing nothing would stop the stack scanning prematurely. if valid_by_cfi || valid_by_symbol_info { Err(FillSymbolError {}) } else { + // To indicate a that a potential instruction is not valid, we can return success + // here but also not fill in the symbol name. This will cause `rust-minidump`'s stack + // scanner to disregard the frame. Ok(()) } } From 489e3a3edbf3b3d4cc2af4921affecd5284d7c2a Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 30 Mar 2026 16:06:21 +0200 Subject: [PATCH 04/10] changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef729484c..1d21c14dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Bug Fixes + +- fix(stackwalking): Use debug info to inform scanning by @loewenheim in [#1905](https://github.com/getsentry/symbolicator/pull/1905) + ## 26.3.1 ### New Features ✨ From 36a91ace9b329a3f6dc5f7e08e0d4cc4ac5e807b Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 30 Mar 2026 16:58:25 +0200 Subject: [PATCH 05/10] extract object_id_from_module function --- .../src/symbolication/process_minidump.rs | 67 +++++++------------ 1 file changed, 25 insertions(+), 42 deletions(-) diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index aaa672730..18f47153e 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -203,6 +203,29 @@ impl SymbolicatorSymbolProvider { } } + fn object_id_from_module(&self, module: &dyn Module) -> ObjectId { + let code_file = non_empty_file_name(&module.code_file()); + let mut debug_file = module.debug_file().as_deref().and_then(non_empty_file_name); + + // Rewrite the first module's debug file according to the configured rewrite rules. + if module.debug_identifier() == self.first_module_debug_id + && let Some(new_debug_file) = debug_file + .as_ref() + .and_then(|debug_file| self.rewrite_first_module.rewrite(debug_file)) + { + debug_file = Some(new_debug_file); + } + + ObjectId { + code_id: module.code_identifier(), + code_file, + debug_id: module.debug_identifier(), + debug_file, + debug_checksum: None, + object_type: self.object_type, + } + } + /// Fetches CFI for the given module, parses it into a `SymbolFile`, and stores it internally. async fn load_cfi_module(&self, module: &(dyn Module + Sync)) -> Arc { let key = LookupKey::new(module); @@ -231,27 +254,7 @@ impl SymbolicatorSymbolProvider { let sources = self.sources.clone(); let scope = self.scope.clone(); - - let code_file = non_empty_file_name(&module.code_file()); - let mut debug_file = module.debug_file().as_deref().and_then(non_empty_file_name); - - // Rewrite the first module's debug file according to the configured rewrite rules. - if module.debug_identifier() == self.first_module_debug_id - && let Some(new_debug_file) = debug_file - .as_ref() - .and_then(|debug_file| self.rewrite_first_module.rewrite(debug_file)) - { - debug_file = Some(new_debug_file); - } - - let identifier = ObjectId { - code_id: module.code_identifier(), - code_file, - debug_id: module.debug_identifier(), - debug_file, - debug_checksum: None, - object_type: self.object_type, - }; + let identifier = self.object_id_from_module(module); let cficache = self .cficache_actor @@ -282,27 +285,7 @@ impl SymbolicatorSymbolProvider { async fn load_symcache(&self, module: &(dyn Module + Sync)) -> DerivedCache { let sources = self.sources.clone(); let scope = self.scope.clone(); - - let code_file = non_empty_file_name(&module.code_file()); - let mut debug_file = module.debug_file().as_deref().and_then(non_empty_file_name); - - // Rewrite the first module's debug file according to the configured rewrite rules. - if module.debug_identifier() == self.first_module_debug_id - && let Some(new_debug_file) = debug_file - .as_ref() - .and_then(|debug_file| self.rewrite_first_module.rewrite(debug_file)) - { - debug_file = Some(new_debug_file); - } - - let identifier = ObjectId { - code_id: module.code_identifier(), - code_file, - debug_id: module.debug_identifier(), - debug_file, - debug_checksum: None, - object_type: self.object_type, - }; + let identifier = self.object_id_from_module(module); self.symcache_actor .fetch(FetchSymCache { From 9a79dfc05f97b4a952098669d85e53a6f2ba7483 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Mon, 30 Mar 2026 17:01:40 +0200 Subject: [PATCH 06/10] Fix comment --- .../symbolicator-native/src/symbolication/process_minidump.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index 18f47153e..140d229a4 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -356,7 +356,7 @@ impl SymbolProvider for SymbolicatorSymbolProvider { } } - // If neither CFI nor symbol info reject the frame, return an error here to signal that + // If either CFI or symbol info does not reject the frame, return an error here to signal that // we have no useful symbol information to contribute. Doing nothing would stop the stack scanning prematurely. if valid_by_cfi || valid_by_symbol_info { Err(FillSymbolError {}) From 0466542db4b246b571dcef23a494fe51c7246344 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 31 Mar 2026 10:23:46 +0200 Subject: [PATCH 07/10] ref: only compute symcache conditionally --- .../src/symbolication/process_minidump.rs | 85 +++++++++++++------ 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index 140d229a4..24bdef59d 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -301,21 +301,26 @@ impl SymbolicatorSymbolProvider { .bind_hub(Hub::new_from_top(Hub::current())) .await } -} -#[async_trait] -impl SymbolProvider for SymbolicatorSymbolProvider { - async fn fill_symbol( + /// Try to validate the given frame's instruction address against the CFI for the module + /// (if we have it). + /// + /// Returns `false` if we have CFI for the module, but that CFI doesn't cover the frame's + /// instruction address. Returns `true` in any other case. + /// + /// This helps the `rust-minidump`'s stack-walker to make better decisions. + /// If the successfully loaded CFI unwind info can not find the potential instruction + /// the passed instruction is most likely not a valid instruction from this module. + /// But since the instruction maps into the range of this module, we know it cannot + /// be part of a different module either -> it's not a valid instruction. + /// + /// See: https://github.com/rust-minidump/rust-minidump/blob/32e01a0e54d987025aa64486ebc4154f7f6b16d2/minidump-unwind/src/lib.rs#L865-L877 + async fn check_frame_by_cfi( &self, module: &(dyn Module + Sync), frame: &mut (dyn FrameSymbolizer + Send), - ) -> Result<(), FillSymbolError> { - // By default we assume that neither CFI nor symbol info give us reason - // to reject the frame. - let mut valid_by_cfi = true; - let mut valid_by_symbol_info = true; - - // This function is being called for every context frame, + ) -> bool { + // This function is being called (through `fill_symbol`) for every context frame, // regardless if any stack walking happens. // In contrast, `walk_frame` below will be skipped in case the minidump // does not contain any actionable stack memory that would allow stack walking. @@ -323,15 +328,6 @@ impl SymbolProvider for SymbolicatorSymbolProvider { // debug_id/file. let cfi_module = self.load_cfi_module(module).await; - // Try to validate the given instruction against the CFI module contents. - // - // This helps the `rust-minidump`'s stack-walker to make better decisions. - // If the successfully loaded CFI unwind info can not find the potential instruction - // the passed instruction is most likely not a valid instruction from this module. - // But since the instruction maps into the range of this module, we know it cannot - // be part of a different module either -> it's not a valid instruction. - // - // See: https://github.com/rust-minidump/rust-minidump/blob/32e01a0e54d987025aa64486ebc4154f7f6b16d2/minidump-unwind/src/lib.rs#L865-L877 if let Ok(Some(cached)) = &cfi_module.cache { let cfi = &cached.0.cfi_stack_info; let instruction = frame.get_instruction() - module.base_address(); @@ -339,26 +335,59 @@ impl SymbolProvider for SymbolicatorSymbolProvider { if !cfi.is_empty() && cfi.get(instruction).is_none() { // We definitely do have CFI information loaded, but the given instruction does not // map to any stack frame info. - valid_by_cfi = false; + return false; } } - let symcache_module = self.load_symcache(module).await; + true + } + + /// Try to validate the given frame's instruction address against the debug information + /// for the module (if we have it). + /// + /// Returns `false` if we have debug info for the module, but that debug info doesn't cover the frame's + /// instruction address. Returns `true` in any other case. + /// + /// This helps the `rust-minidump`'s stack-walker to make better decisions. + /// If the successfully loaded symcache can not find the potential instruction + /// the passed instruction is most likely not a valid instruction from this module. + /// But since the instruction maps into the range of this module, we know it cannot + /// be part of a different module either -> it's not a valid instruction. + /// + /// See: https://github.com/rust-minidump/rust-minidump/blob/32e01a0e54d987025aa64486ebc4154f7f6b16d2/minidump-unwind/src/lib.rs#L865-L877 + async fn check_frame_by_symbol_info( + &self, + module: &(dyn Module + Sync), + frame: &mut (dyn FrameSymbolizer + Send), + ) -> bool { + let symcache = self.load_symcache(module).await; - // As above, but with symbol/debug information this time. - if let Ok(cached) = &symcache_module.cache { + if let Ok(cached) = &symcache.cache { let instruction = frame.get_instruction() - module.base_address(); if cached.get().lookup(instruction).next().is_none() { // We definitely do have symbol information loaded, but the given instruction does not // map to any symbol info. - valid_by_symbol_info = false; + return false; } } - // If either CFI or symbol info does not reject the frame, return an error here to signal that - // we have no useful symbol information to contribute. Doing nothing would stop the stack scanning prematurely. - if valid_by_cfi || valid_by_symbol_info { + true + } +} + +#[async_trait] +impl SymbolProvider for SymbolicatorSymbolProvider { + async fn fill_symbol( + &self, + module: &(dyn Module + Sync), + frame: &mut (dyn FrameSymbolizer + Send), + ) -> Result<(), FillSymbolError> { + if self.check_frame_by_cfi(module, frame).await + || self.check_frame_by_symbol_info(module, frame).await + { + // If either CFI or symbol info does not reject the frame, return an error here to signal that + // we have no useful symbol information to contribute. Doing nothing would stop the stack scanning prematurely. Err(FillSymbolError {}) } else { // To indicate a that a potential instruction is not valid, we can return success From ead26c5e8ac5e5c5b0abf69b9a77b083f8a6a7b2 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 31 Mar 2026 16:21:15 +0200 Subject: [PATCH 08/10] Add test --- .../tests/integration/process_minidump.rs | 33 + ...s_minidump__minidump_macos_broken_cfi.snap | 105 ++ tests/fixtures/macos-no-fp.dmp | Bin 0 -> 151472 bytes .../notes.md | 3 + .../sentry_example.sym | 1181 ++++++++++++++++ .../sentry_example.sym.original | 1232 +++++++++++++++++ 6 files changed, 2554 insertions(+) create mode 100644 crates/symbolicator-native/tests/integration/snapshots/integration__process_minidump__minidump_macos_broken_cfi.snap create mode 100644 tests/fixtures/macos-no-fp.dmp create mode 100644 tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/notes.md create mode 100644 tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym create mode 100644 tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym.original diff --git a/crates/symbolicator-native/tests/integration/process_minidump.rs b/crates/symbolicator-native/tests/integration/process_minidump.rs index 890602ee0..be8009b41 100644 --- a/crates/symbolicator-native/tests/integration/process_minidump.rs +++ b/crates/symbolicator-native/tests/integration/process_minidump.rs @@ -48,6 +48,39 @@ async fn test_minidump_macos() { assert_snapshot!(res); } +/// Verifies that debug information is used to guide stack scanning. +/// +/// The minidump being tested has frame pointers disabled, so in the absence of (usable) CFI, +/// there is no choice but to scan. Left to its own devices, the stack scanner can produce a lot +/// of spurious frames, so we want to use both CFI and debug info that we have available to guide +/// it. The heuristic is as follows: if stack scanning would produce an instruction address +/// * falling into some module, +/// * for which we have CFI or debug info, +/// * which doesn't cover that instruction address, +/// then that address is probably bogus. +/// +/// The CFI half of this heuristic was implemented in +/// https://github.com/getsentry/symbolicator/pull/1651. +/// https://github.com/getsentry/symbolicator/pull/1913 added the debug info part. +/// +/// This test simulates an actual customer situation: we have both debug info and CFI +/// for the minidump, but the CFI is truncated/poor. If we only used CFI to constrain the +/// stack scanner, all frames in `main.c` would be rejected. However, since we also use +/// the (good) debug info to check the frames, they are retained. +/// +/// The `dyld` frames in the stacktrace are found by scanning, and since we have no CFI or +/// debug info at all for that module, they're all accepted. +#[tokio::test] +async fn test_minidump_macos_broken_cfi() { + let res = stackwalk_minidump("macos-no-fp.dmp").await; + let crashed_thread = res + .stacktraces + .iter() + .find(|st| st.is_requesting.unwrap_or_default()) + .unwrap(); + assert_snapshot!(crashed_thread); +} + #[tokio::test] async fn test_minidump_linux() { let res = stackwalk_minidump("linux.dmp").await; diff --git a/crates/symbolicator-native/tests/integration/snapshots/integration__process_minidump__minidump_macos_broken_cfi.snap b/crates/symbolicator-native/tests/integration/snapshots/integration__process_minidump__minidump_macos_broken_cfi.snap new file mode 100644 index 000000000..e6f60b881 --- /dev/null +++ b/crates/symbolicator-native/tests/integration/snapshots/integration__process_minidump__minidump_macos_broken_cfi.snap @@ -0,0 +1,105 @@ +--- +source: crates/symbolicator-native/tests/integration/process_minidump.rs +expression: crashed_thread +--- +thread_id: 6130742 +is_requesting: true +registers: + fp: "0x16f74b1e0" + lr: "0x1006b7628" + pc: "0x18bb0105c" + sp: "0x16f74a510" + x0: "0x1" + x1: "0x101010101010101" + x10: "0x2" + x11: "0x10000000000" + x12: "0xfffffffd" + x13: "0x0" + x14: "0x0" + x15: "0x0" + x16: "0x18bb00ff0" + x17: "0x1faaf8e30" + x18: "0x0" + x19: "0x1f97e40b0" + x2: "0x64" + x20: "0x1f97e4018" + x21: "0x16f74ac28" + x22: "0xfffffff0009d6fb" + x23: "0x1f97e4018" + x24: "0x1f97e4150" + x25: "0x16f74ad90" + x26: "0x0" + x27: "0x0" + x28: "0x0" + x3: "0x1" + x4: "0x0" + x5: "0x0" + x6: "0x600003494120" + x7: "0x950" + x8: "0x1006c0000" + x9: "0x1" +frames: + - status: missing + original_index: 0 + instruction_addr: "0x18bb0105c" + package: /usr/lib/system/libsystem_platform.dylib + trust: context + - status: symbolicated + original_index: 1 + instruction_addr: "0x1006b6480" + package: build/sentry_example + symbol: main + sym_addr: "0x1006b4ea0" + function: main + filename: example.c + abs_path: /Users/sentry/code/sentry-native/examples/example.c + lineno: 975 + trust: scan + - status: missing + original_index: 2 + instruction_addr: "0x18b727f28" + package: /usr/lib/dyld + trust: scan + - status: symbolicated + original_index: 3 + instruction_addr: "0x1006b401c" + package: build/sentry_example + symbol: _mh_execute_header + sym_addr: "0x1006b4000" + function: _mh_execute_header + lineno: 0 + trust: scan + - status: symbolicated + original_index: 4 + instruction_addr: "0x1006b458c" + package: build/sentry_example + symbol: _mh_execute_header + sym_addr: "0x1006b4000" + function: _mh_execute_header + lineno: 0 + trust: scan + - status: missing + original_index: 5 + instruction_addr: "0x18b728994" + package: /usr/lib/dyld + trust: scan + - status: missing + original_index: 6 + instruction_addr: "0x18b728978" + package: /usr/lib/dyld + trust: scan + - status: missing + original_index: 7 + instruction_addr: "0x18b72898c" + package: /usr/lib/dyld + trust: scan + - status: missing + original_index: 8 + instruction_addr: "0x18b7a0184" + package: /usr/lib/dyld + trust: scan + - status: missing + original_index: 9 + instruction_addr: "0x18b72943c" + package: /usr/lib/dyld + trust: scan diff --git a/tests/fixtures/macos-no-fp.dmp b/tests/fixtures/macos-no-fp.dmp new file mode 100644 index 0000000000000000000000000000000000000000..5d3873e528fd50a25c704e9bbc0d08c974c7b02f GIT binary patch literal 151472 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/notes.md b/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/notes.md new file mode 100644 index 000000000..b0b13a278 --- /dev/null +++ b/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/notes.md @@ -0,0 +1,3 @@ +`sentry_example.sym` is a breakpad file with present, but severely truncated CFI. +`sentry_example.sym.original` is the untruncated version. It was extracted from a +MacOS dSYM file using breakpad's `dump_syms`. diff --git a/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym b/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym new file mode 100644 index 000000000..fa1c8bd15 --- /dev/null +++ b/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym @@ -0,0 +1,1181 @@ +MODULE mac arm64 73781EDEBF5B34EC81B2749A0F1FA5FD0 sentry_example +FILE 0 /Users/sentry/code/sentry-native/examples/example.c +FUNC d98 24 0 get_current_thread_id +d98 8 46 0 +da0 c 48 0 +dac 4 49 0 +db0 c 49 0 +FUNC dbc 78 0 log_thread_func +dbc c 478 0 +dc8 4 480 0 +dcc 4 480 0 +dd0 4 480 0 +dd4 c 480 0 +de0 8 482 0 +de8 8 482 0 +df0 18 481 0 +e08 8 483 0 +e10 4 484 0 +e14 c 480 0 +e20 4 480 0 +e24 4 485 0 +e28 c 485 0 +FUNC e34 6c 0 metric_thread_func +e34 c 490 0 +e40 4 492 0 +e44 4 492 0 +e48 4 492 0 +e4c c 492 0 +e58 8 493 0 +e60 14 493 0 +e74 8 494 0 +e7c 4 495 0 +e80 c 492 0 +e8c 4 492 0 +e90 4 496 0 +e94 c 496 0 +FUNC ea0 1d9c 0 main +ea0 30 514 0 +ed0 4 515 0 +ed4 4 515 0 +ed8 4 517 0 +edc 4 517 0 +ee0 c 517 0 +eec 8 517 0 +ef4 4 518 0 +ef8 8 518 0 +f00 4 519 0 +f04 4 523 0 +f08 c 523 0 +f14 4 525 0 +f18 8 525 0 +f20 4 526 0 +f24 8 526 0 +f2c 4 528 0 +f30 c 528 0 +f3c 4 530 0 +f40 4 530 0 +f44 c 530 0 +f50 8 530 0 +f58 4 531 0 +f5c c 531 0 +f68 4 532 0 +f6c 4 534 0 +f70 4 534 0 +f74 c 534 0 +f80 8 534 0 +f88 4 535 0 +f8c 8 535 0 +f94 4 536 0 +f98 4 538 0 +f9c 4 538 0 +fa0 c 538 0 +fac 8 538 0 +fb4 4 541 0 +fb8 c 541 0 +fc4 4 542 0 +fc8 4 544 0 +fcc 4 544 0 +fd0 c 544 0 +fdc 8 544 0 +fe4 8 546 0 +fec 14 546 0 +1000 4 545 0 +1004 4 547 0 +1008 4 549 0 +100c 4 549 0 +1010 c 549 0 +101c 8 549 0 +1024 4 550 0 +1028 8 550 0 +1030 4 551 0 +1034 4 553 0 +1038 4 553 0 +103c c 553 0 +1048 8 553 0 +1050 4 554 0 +1054 8 554 0 +105c 4 555 0 +1060 4 557 0 +1064 4 557 0 +1068 c 557 0 +1074 8 557 0 +107c 4 558 0 +1080 10 558 0 +1090 4 559 0 +1094 4 561 0 +1098 4 561 0 +109c c 561 0 +10a8 8 561 0 +10b0 4 563 0 +10b4 10 562 0 +10c4 4 564 0 +10c8 4 566 0 +10cc 4 566 0 +10d0 c 566 0 +10dc 8 566 0 +10e4 4 567 0 +10e8 10 567 0 +10f8 4 568 0 +10fc 4 570 0 +1100 4 570 0 +1104 c 570 0 +1110 8 570 0 +1118 4 572 0 +111c 10 571 0 +112c 4 573 0 +1130 4 575 0 +1134 4 575 0 +1138 c 575 0 +1144 8 575 0 +114c 4 577 0 +1150 10 576 0 +1160 4 578 0 +1164 4 580 0 +1168 4 580 0 +116c c 580 0 +1178 8 580 0 +1180 4 582 0 +1184 10 581 0 +1194 4 583 0 +1198 4 585 0 +119c 4 585 0 +11a0 c 585 0 +11ac 8 585 0 +11b4 4 587 0 +11b8 10 586 0 +11c8 4 588 0 +11cc 4 590 0 +11d0 4 590 0 +11d4 c 590 0 +11e0 8 590 0 +11e8 4 592 0 +11ec 10 591 0 +11fc 4 593 0 +1200 4 595 0 +1204 4 595 0 +1208 c 595 0 +1214 8 595 0 +121c 4 597 0 +1220 10 596 0 +1230 4 598 0 +1234 4 600 0 +1238 4 600 0 +123c c 600 0 +1248 8 600 0 +1250 4 601 0 +1254 c 601 0 +1260 4 602 0 +1264 4 604 0 +1268 4 604 0 +126c c 604 0 +1278 8 604 0 +1280 8 0 0 +1288 30 606 0 +12b8 4 608 0 +12bc 4 608 0 +12c0 4 609 0 +12c4 4 610 0 +12c8 4 610 0 +12cc c 610 0 +12d8 8 610 0 +12e0 8 0 0 +12e8 34 612 0 +131c 4 614 0 +1320 4 614 0 +1324 4 615 0 +1328 4 616 0 +132c 4 616 0 +1330 c 616 0 +133c 8 616 0 +1344 8 0 0 +134c 30 618 0 +137c 4 620 0 +1380 4 620 0 +1384 4 621 0 +1388 4 622 0 +138c 4 622 0 +1390 c 622 0 +139c 8 622 0 +13a4 4 623 0 +13a8 c 623 0 +13b4 4 624 0 +13b8 4 625 0 +13bc 4 625 0 +13c0 c 625 0 +13cc 8 625 0 +13d4 8 0 0 +13dc 30 627 0 +140c 4 629 0 +1410 4 629 0 +1414 4 630 0 +1418 4 632 0 +141c 4 632 0 +1420 c 632 0 +142c 8 632 0 +1434 4 633 0 +1438 8 633 0 +1440 4 634 0 +1444 4 636 0 +1448 4 636 0 +144c c 636 0 +1458 8 636 0 +1460 4 639 0 +1464 c 639 0 +1470 4 640 0 +1474 4 642 0 +1478 4 642 0 +147c c 642 0 +1488 8 642 0 +1490 4 644 0 +1494 10 644 0 +14a4 4 645 0 +14a8 4 647 0 +14ac 4 647 0 +14b0 c 647 0 +14bc 8 647 0 +14c4 4 649 0 +14c8 8 649 0 +14d0 4 650 0 +14d4 4 652 0 +14d8 4 652 0 +14dc c 652 0 +14e8 8 652 0 +14f0 4 654 0 +14f4 8 654 0 +14fc 4 655 0 +1500 4 657 0 +1504 4 657 0 +1508 c 657 0 +1514 8 657 0 +151c 4 658 0 +1520 8 658 0 +1528 4 659 0 +152c 4 661 0 +1530 4 661 0 +1534 c 661 0 +1540 8 661 0 +1548 4 667 0 +154c c 666 0 +1558 4 669 0 +155c 4 670 0 +1560 4 670 0 +1564 c 670 0 +1570 8 670 0 +1578 4 671 0 +157c 8 671 0 +1584 4 672 0 +1588 4 673 0 +158c 4 673 0 +1590 c 673 0 +159c 8 673 0 +15a4 4 674 0 +15a8 8 674 0 +15b0 4 675 0 +15b4 8 675 0 +15bc 4 676 0 +15c0 c 676 0 +15cc 4 677 0 +15d0 8 677 0 +15d8 4 678 0 +15dc 4 680 0 +15e0 4 680 0 +15e4 c 680 0 +15f0 8 680 0 +15f8 4 681 0 +15fc 8 681 0 +1604 4 682 0 +1608 4 684 0 +160c 4 684 0 +1610 c 684 0 +161c 8 684 0 +1624 4 686 0 +1628 10 685 0 +1638 4 687 0 +163c 4 689 0 +1640 4 689 0 +1644 c 689 0 +1650 8 689 0 +1658 4 691 0 +165c 10 690 0 +166c 4 692 0 +1670 4 694 0 +1674 4 694 0 +1678 c 694 0 +1684 8 694 0 +168c 4 696 0 +1690 10 695 0 +16a0 4 697 0 +16a4 4 699 0 +16a8 4 699 0 +16ac c 699 0 +16b8 8 699 0 +16c0 4 701 0 +16c4 10 700 0 +16d4 4 702 0 +16d8 4 704 0 +16dc 4 704 0 +16e0 c 704 0 +16ec 8 704 0 +16f4 4 705 0 +16f8 4 705 0 +16fc c 705 0 +1708 4 705 0 +170c 4 706 0 +1710 8 706 0 +1718 4 707 0 +171c c 707 0 +1728 8 707 0 +1730 4 709 0 +1734 8 708 0 +173c 4 710 0 +1740 4 710 0 +1744 c 710 0 +1750 8 710 0 +1758 4 712 0 +175c 8 711 0 +1764 4 713 0 +1768 4 713 0 +176c c 713 0 +1778 8 713 0 +1780 4 715 0 +1784 8 714 0 +178c 4 716 0 +1790 8 0 0 +1798 4 717 0 +179c 4 718 0 +17a0 10 721 0 +17b0 4 722 0 +17b4 4 722 0 +17b8 c 722 0 +17c4 8 722 0 +17cc 18 723 0 +17e4 8 724 0 +17ec 4 725 0 +17f0 4 727 0 +17f4 4 727 0 +17f8 8 727 0 +1800 c 728 0 +180c 4 731 0 +1810 4 731 0 +1814 c 731 0 +1820 8 731 0 +1828 c 733 0 +1834 14 733 0 +1848 10 732 0 +1858 10 735 0 +1868 c 735 0 +1874 10 734 0 +1884 20 737 0 +18a4 c 737 0 +18b0 1c 736 0 +18cc c 740 0 +18d8 c 739 0 +18e4 10 738 0 +18f4 8 741 0 +18fc 10 742 0 +190c c 742 0 +1918 10 743 0 +1928 10 743 0 +1938 c 745 0 +1944 14 744 0 +1958 c 749 0 +1964 c 748 0 +1970 10 747 0 +1980 4 750 0 +1984 4 753 0 +1988 8 753 0 +1990 14 754 0 +19a4 18 755 0 +19bc 14 756 0 +19d0 c 757 0 +19dc 4 757 0 +19e0 4 758 0 +19e4 4 760 0 +19e8 4 760 0 +19ec c 760 0 +19f8 8 760 0 +1a00 8 761 0 +1a08 10 763 0 +1a18 14 762 0 +1a2c c 765 0 +1a38 14 764 0 +1a4c c 767 0 +1a58 14 766 0 +1a6c 14 768 0 +1a80 14 769 0 +1a94 14 770 0 +1aa8 20 772 0 +1ac8 8 776 0 +1ad0 24 775 0 +1af4 8 778 0 +1afc 14 780 0 +1b10 c 779 0 +1b1c 14 782 0 +1b30 c 781 0 +1b3c 14 783 0 +1b50 14 785 0 +1b64 18 787 0 +1b7c 4 789 0 +1b80 4 791 0 +1b84 4 791 0 +1b88 c 791 0 +1b94 8 791 0 +1b9c 18 793 0 +1bb4 4 792 0 +1bb8 4 794 0 +1bbc c 794 0 +1bc8 4 795 0 +1bcc 4 797 0 +1bd0 4 797 0 +1bd4 8 797 0 +1bdc 4 798 0 +1be0 4 798 0 +1be4 c 798 0 +1bf0 8 798 0 +1bf8 c 799 0 +1c04 4 800 0 +1c08 4 801 0 +1c0c 4 801 0 +1c10 c 801 0 +1c1c 8 801 0 +1c24 4 802 0 +1c28 4 802 0 +1c2c 4 802 0 +1c30 c 802 0 +1c3c 4 803 0 +1c40 14 803 0 +1c54 4 804 0 +1c58 c 802 0 +1c64 4 802 0 +1c68 8 806 0 +1c70 c 808 0 +1c7c 4 809 0 +1c80 4 810 0 +1c84 4 810 0 +1c88 c 810 0 +1c94 8 810 0 +1c9c c 811 0 +1ca8 4 812 0 +1cac 4 813 0 +1cb0 4 815 0 +1cb4 4 815 0 +1cb8 8 815 0 +1cc0 4 816 0 +1cc4 4 816 0 +1cc8 c 816 0 +1cd4 8 816 0 +1cdc 8 817 0 +1ce4 14 817 0 +1cf8 4 818 0 +1cfc 4 819 0 +1d00 4 819 0 +1d04 c 819 0 +1d10 8 819 0 +1d18 8 820 0 +1d20 14 820 0 +1d34 8 822 0 +1d3c 24 821 0 +1d60 8 824 0 +1d68 2c 823 0 +1d94 4 825 0 +1d98 4 826 0 +1d9c 4 826 0 +1da0 c 826 0 +1dac 8 826 0 +1db4 8 827 0 +1dbc 10 829 0 +1dcc 10 828 0 +1ddc 14 830 0 +1df0 14 831 0 +1e04 4 832 0 +1e08 4 833 0 +1e0c 4 833 0 +1e10 c 833 0 +1e1c 8 833 0 +1e24 4 834 0 +1e28 4 834 0 +1e2c 4 834 0 +1e30 c 834 0 +1e3c 8 836 0 +1e44 14 835 0 +1e58 4 837 0 +1e5c c 834 0 +1e68 4 834 0 +1e6c 8 838 0 +1e74 8 840 0 +1e7c 14 839 0 +1e90 4 841 0 +1e94 4 842 0 +1e98 4 842 0 +1e9c c 842 0 +1ea8 8 842 0 +1eb0 c 843 0 +1ebc 4 844 0 +1ec0 4 845 0 +1ec4 4 847 0 +1ec8 4 847 0 +1ecc c 847 0 +1ed8 8 847 0 +1ee0 c 848 0 +1eec 14 849 0 +1f00 8 850 0 +1f08 10 850 0 +1f18 10 853 0 +1f28 14 851 0 +1f3c 1c 854 0 +1f58 8 855 0 +1f60 4 856 0 +1f64 14 858 0 +1f78 8 860 0 +1f80 14 859 0 +1f94 10 862 0 +1fa4 18 861 0 +1fbc 8 863 0 +1fc4 24 866 0 +1fe8 c 867 0 +1ff4 10 870 0 +2004 8 871 0 +200c 10 873 0 +201c c 874 0 +2028 10 877 0 +2038 10 879 0 +2048 14 878 0 +205c 8 880 0 +2064 4 881 0 +2068 4 883 0 +206c 4 883 0 +2070 c 883 0 +207c 8 883 0 +2084 c 884 0 +2090 c 885 0 +209c 4 886 0 +20a0 4 886 0 +20a4 4 886 0 +20a8 4 887 0 +20ac 4 889 0 +20b0 4 889 0 +20b4 c 889 0 +20c0 8 889 0 +20c8 c 892 0 +20d4 18 894 0 +20ec 4 893 0 +20f0 4 895 0 +20f4 c 895 0 +2100 4 896 0 +2104 4 898 0 +2108 4 898 0 +210c c 898 0 +2118 8 898 0 +2120 c 899 0 +212c c 900 0 +2138 4 901 0 +213c 4 903 0 +2140 4 903 0 +2144 c 903 0 +2150 8 903 0 +2158 4 904 0 +215c 4 905 0 +2160 4 907 0 +2164 4 907 0 +2168 c 907 0 +2174 8 907 0 +217c 4 908 0 +2180 4 908 0 +2184 4 908 0 +2188 c 908 0 +2194 30 910 0 +21c4 c 911 0 +21d0 8 911 0 +21d8 4 912 0 +21dc c 908 0 +21e8 4 908 0 +21ec 4 913 0 +21f0 4 915 0 +21f4 4 915 0 +21f8 c 915 0 +2204 8 915 0 +220c 4 916 0 +2210 4 917 0 +2214 4 919 0 +2218 4 919 0 +221c c 919 0 +2228 8 919 0 +2230 4 920 0 +2234 4 920 0 +2238 24 922 0 +225c 10 926 0 +226c 4 927 0 +2270 8 927 0 +2278 10 929 0 +2288 4 930 0 +228c 8 930 0 +2294 4 932 0 +2298 4 932 0 +229c c 932 0 +22a8 8 932 0 +22b0 4 935 0 +22b4 c 935 0 +22c0 4 937 0 +22c4 18 936 0 +22dc 4 936 0 +22e0 4 939 0 +22e4 c 938 0 +22f0 4 940 0 +22f4 4 942 0 +22f8 14 942 0 +230c 4 943 0 +2310 4 945 0 +2314 4 945 0 +2318 c 945 0 +2324 8 945 0 +232c 4 946 0 +2330 4 946 0 +2334 4 946 0 +2338 c 946 0 +2344 38 948 0 +237c c 950 0 +2388 14 952 0 +239c 4 953 0 +23a0 c 946 0 +23ac 4 946 0 +23b0 4 954 0 +23b4 4 956 0 +23b8 4 956 0 +23bc c 956 0 +23c8 8 956 0 +23d0 4 957 0 +23d4 4 958 0 +23d8 4 960 0 +23dc 4 960 0 +23e0 c 960 0 +23ec 8 960 0 +23f4 8 961 0 +23fc 4 962 0 +2400 4 964 0 +2404 4 964 0 +2408 c 964 0 +2414 8 964 0 +241c 8 965 0 +2424 4 966 0 +2428 4 968 0 +242c 4 968 0 +2430 c 968 0 +243c 8 968 0 +2444 c 970 0 +2450 c 971 0 +245c 4 971 0 +2460 4 972 0 +2464 4 974 0 +2468 4 974 0 +246c c 974 0 +2478 8 974 0 +2480 4 975 0 +2484 4 976 0 +2488 4 977 0 +248c 4 977 0 +2490 c 977 0 +249c 8 977 0 +24a4 4 978 0 +24a8 4 979 0 +24ac 4 980 0 +24b0 4 980 0 +24b4 c 980 0 +24c0 8 980 0 +24c8 4 981 0 +24cc 4 982 0 +24d0 4 992 0 +24d4 4 992 0 +24d8 c 992 0 +24e4 8 992 0 +24ec 20 993 0 +250c 4 995 0 +2510 4 995 0 +2514 c 995 0 +2520 8 995 0 +2528 4 1000 0 +252c 4 1003 0 +2530 4 1003 0 +2534 c 1003 0 +2540 8 1003 0 +2548 8 1004 0 +2550 4 1005 0 +2554 4 1006 0 +2558 4 1006 0 +255c c 1006 0 +2568 8 1006 0 +2570 4 1007 0 +2574 8 1007 0 +257c 4 1008 0 +2580 4 1011 0 +2584 4 1011 0 +2588 c 1011 0 +2594 8 1011 0 +259c 1c 1012 0 +25b8 4 1014 0 +25bc 4 1014 0 +25c0 c 1014 0 +25cc 8 1014 0 +25d4 4 1016 0 +25d8 10 1016 0 +25e8 10 1017 0 +25f8 c 1018 0 +2604 4 1019 0 +2608 14 1020 0 +261c 4 1021 0 +2620 4 1022 0 +2624 4 1022 0 +2628 c 1022 0 +2634 8 1022 0 +263c 18 1023 0 +2654 4 1025 0 +2658 4 1025 0 +265c c 1025 0 +2668 8 1025 0 +2670 10 1026 0 +2680 4 1027 0 +2684 8 1028 0 +268c c 1029 0 +2698 14 1031 0 +26ac 4 1032 0 +26b0 4 1033 0 +26b4 4 1033 0 +26b8 c 1033 0 +26c4 8 1033 0 +26cc 24 1034 0 +26f0 8 1037 0 +26f8 4 1038 0 +26fc 4 1039 0 +2700 4 1039 0 +2704 c 1039 0 +2710 8 1039 0 +2718 24 1040 0 +273c 4 1044 0 +2740 4 1044 0 +2744 c 1047 0 +2750 4 1048 0 +2754 c 1048 0 +2760 4 1048 0 +2764 4 1049 0 +2768 8 1049 0 +2770 4 1050 0 +2774 c 1050 0 +2780 4 1051 0 +2784 4 1051 0 +2788 4 1052 0 +278c 4 1055 0 +2790 4 1055 0 +2794 4 1055 0 +2798 c 1058 0 +27a4 8 1060 0 +27ac 8 1060 0 +27b4 4 1060 0 +27b8 10 1060 0 +27c8 c 1059 0 +27d4 4 1063 0 +27d8 8 1063 0 +27e0 4 1066 0 +27e4 4 1066 0 +27e8 4 1067 0 +27ec 4 1068 0 +27f0 4 1068 0 +27f4 c 1068 0 +2800 8 1068 0 +2808 1c 1069 0 +2824 1c 1071 0 +2840 20 1074 0 +2860 8 1077 0 +2868 4 1079 0 +286c 4 1081 0 +2870 4 1081 0 +2874 c 1081 0 +2880 8 1081 0 +2888 14 1083 0 +289c 4 1082 0 +28a0 4 1086 0 +28a4 4 1086 0 +28a8 c 1086 0 +28b4 8 1086 0 +28bc 4 1087 0 +28c0 8 1087 0 +28c8 4 1088 0 +28cc 8 1090 0 +28d4 c 1092 0 +28e0 14 1091 0 +28f4 4 1094 0 +28f8 4 1094 0 +28fc c 1094 0 +2908 8 1094 0 +2910 c 1095 0 +291c 4 1098 0 +2920 4 1098 0 +2924 c 1097 0 +2930 4 1099 0 +2934 4 1102 0 +2938 8 1102 0 +2940 4 1101 0 +2944 8 1105 0 +294c 18 1105 0 +2964 10 1104 0 +2974 4 1107 0 +2978 4 1107 0 +297c c 1107 0 +2988 8 1107 0 +2990 4 1109 0 +2994 8 1108 0 +299c 4 1110 0 +29a0 4 1112 0 +29a4 4 1112 0 +29a8 c 1112 0 +29b4 8 1112 0 +29bc 4 1114 0 +29c0 18 1114 0 +29d8 4 1113 0 +29dc 4 1116 0 +29e0 c 1116 0 +29ec 4 1115 0 +29f0 8 1119 0 +29f8 18 1119 0 +2a10 10 1118 0 +2a20 4 1121 0 +2a24 4 1121 0 +2a28 c 1121 0 +2a34 8 1121 0 +2a3c 4 1122 0 +2a40 8 1122 0 +2a48 4 1124 0 +2a4c 8 1123 0 +2a54 4 1125 0 +2a58 4 1127 0 +2a5c 4 1127 0 +2a60 4 1128 0 +2a64 4 1128 0 +2a68 4 1129 0 +2a6c 4 1131 0 +2a70 4 1131 0 +2a74 c 1131 0 +2a80 8 1131 0 +2a88 4 1132 0 +2a8c 4 1132 0 +2a90 1c 1133 0 +2aac 14 1135 0 +2ac0 4 1136 0 +2ac4 4 1136 0 +2ac8 c 1136 0 +2ad4 8 1136 0 +2adc c 1137 0 +2ae8 4 1138 0 +2aec 4 1139 0 +2af0 4 1139 0 +2af4 c 1139 0 +2b00 8 1139 0 +2b08 8 1141 0 +2b10 14 1140 0 +2b24 4 1142 0 +2b28 4 1143 0 +2b2c 4 1145 0 +2b30 10 1145 0 +2b40 4 1146 0 +2b44 4 1146 0 +2b48 c 1146 0 +2b54 8 1146 0 +2b5c c 1147 0 +2b68 4 1148 0 +2b6c 4 1149 0 +2b70 4 1151 0 +2b74 4 1151 0 +2b78 c 1151 0 +2b84 8 1151 0 +2b8c 18 1152 0 +2ba4 4 1153 0 +2ba8 4 1156 0 +2bac 4 1158 0 +2bb0 4 1158 0 +2bb4 c 1158 0 +2bc0 8 1158 0 +2bc8 8 1159 0 +2bd0 4 1160 0 +2bd4 4 1162 0 +2bd8 4 1162 0 +2bdc c 1162 0 +2be8 8 1162 0 +2bf0 4 1163 0 +2bf4 4 1164 0 +2bf8 8 1166 0 +2c00 28 1167 0 +2c28 4 0 0 +2c2c 10 1167 0 +FUNC 2c3c a0 0 has_arg +2c3c 14 257 0 +2c50 8 258 0 +2c58 4 258 0 +2c5c 4 258 0 +2c60 4 258 0 +2c64 c 258 0 +2c70 4 259 0 +2c74 4 259 0 +2c78 4 259 0 +2c7c 4 259 0 +2c80 4 259 0 +2c84 8 259 0 +2c8c 4 0 0 +2c90 10 260 0 +2ca0 4 262 0 +2ca4 c 258 0 +2cb0 4 258 0 +2cb4 4 0 0 +2cb8 10 263 0 +2cc8 8 264 0 +2cd0 c 264 0 +FUNC 2cdc 58 0 print_envelope +2cdc 14 246 0 +2cf0 4 248 0 +2cf4 4 249 0 +2cf8 4 249 0 +2cfc 4 249 0 +2d00 4 250 0 +2d04 14 250 0 +2d18 4 251 0 +2d1c 4 251 0 +2d20 4 252 0 +2d24 4 252 0 +2d28 c 253 0 +FUNC 2d34 50 0 before_send_callback +2d34 14 93 0 +2d48 10 99 0 +2d58 14 98 0 +2d6c 8 102 0 +2d74 4 102 0 +2d78 c 102 0 +FUNC 2d84 34 0 discarding_before_send_callback +2d84 14 108 0 +2d98 8 113 0 +2da0 8 114 0 +2da8 4 114 0 +2dac c 114 0 +FUNC 2db8 24 0 on_crash_callback +2db8 10 132 0 +2dc8 8 137 0 +2dd0 4 137 0 +2dd4 8 137 0 +FUNC 2ddc 34 0 discarding_on_crash_callback +2ddc 14 120 0 +2df0 8 125 0 +2df8 8 126 0 +2e00 4 126 0 +2e04 c 126 0 +FUNC 2e10 4c 0 before_transaction_callback +2e10 10 142 0 +2e20 10 146 0 +2e30 14 145 0 +2e44 8 147 0 +2e4c 4 147 0 +2e50 c 147 0 +FUNC 2e5c 64 0 discarding_before_transaction_callback +2e5c 10 152 0 +2e6c 14 155 0 +2e80 8 155 0 +2e88 8 155 0 +2e90 8 156 0 +2e98 8 157 0 +2ea0 4 157 0 +2ea4 8 159 0 +2eac 4 159 0 +2eb0 4 160 0 +2eb4 c 160 0 +FUNC 2ec0 70 0 before_send_log_callback +2ec0 10 164 0 +2ed0 10 167 0 +2ee0 10 167 0 +2ef0 14 168 0 +2f04 14 168 0 +2f18 8 170 0 +2f20 4 170 0 +2f24 c 170 0 +FUNC 2f30 78 0 discarding_before_send_log_callback +2f30 10 175 0 +2f40 14 178 0 +2f54 14 178 0 +2f68 8 177 0 +2f70 8 177 0 +2f78 8 180 0 +2f80 8 181 0 +2f88 4 181 0 +2f8c 8 183 0 +2f94 4 183 0 +2f98 4 184 0 +2f9c c 184 0 +FUNC 2fa8 e8 0 traces_sampler_callback +2fa8 18 66 0 +2fc0 4 69 0 +2fc4 8 69 0 +2fcc 4 70 0 +2fd0 4 70 0 +2fd4 8 70 0 +2fdc 18 71 0 +2ff4 c 73 0 +3000 4 75 0 +3004 4 75 0 +3008 c 75 0 +3014 8 75 0 +301c 4 78 0 +3020 4 78 0 +3024 c 78 0 +3030 8 78 0 +3038 14 82 0 +304c 8 81 0 +3054 c 81 0 +3060 c 84 0 +306c 4 86 0 +3070 4 87 0 +3074 c 88 0 +3080 4 89 0 +3084 c 89 0 +FUNC 3090 e0 0 make_proxy_url +3090 24 274 0 +30b4 4 275 0 +30b8 4 275 0 +30bc 4 275 0 +30c0 4 276 0 +30c4 8 276 0 +30cc 4 277 0 +30d0 4 277 0 +30d4 4 277 0 +30d8 4 279 0 +30dc 8 279 0 +30e4 40 280 0 +3124 4 282 0 +3128 3c 283 0 +3164 c 285 0 +FUNC 3170 a4 0 test_logger_callback +3170 2c 232 0 +319c 24 237 0 +31c0 14 240 0 +31d4 c 241 0 +31e0 4 241 0 +31e4 20 242 0 +3204 10 242 0 +FUNC 3214 70 0 before_send_metric_callback +3214 10 188 0 +3224 10 191 0 +3234 10 191 0 +3244 14 192 0 +3258 14 192 0 +326c 8 194 0 +3274 4 194 0 +3278 c 194 0 +FUNC 3284 30 0 discarding_before_send_metric_callback +3284 10 199 0 +3294 8 201 0 +329c 8 202 0 +32a4 4 202 0 +32a8 c 202 0 +FUNC 32b4 4c 0 before_breadcrumb_callback +32b4 10 207 0 +32c4 10 212 0 +32d4 14 211 0 +32e8 8 214 0 +32f0 4 214 0 +32f4 c 214 0 +FUNC 3300 30 0 discarding_before_breadcrumb_callback +3300 10 220 0 +3310 8 224 0 +3318 8 225 0 +3320 4 225 0 +3324 c 225 0 +FUNC 3330 98 0 get_arg_value +3330 14 289 0 +3344 8 290 0 +334c 4 290 0 +3350 4 290 0 +3354 4 290 0 +3358 4 290 0 +335c c 290 0 +3368 4 291 0 +336c 4 291 0 +3370 4 291 0 +3374 4 291 0 +3378 4 291 0 +337c 8 291 0 +3384 4 292 0 +3388 4 292 0 +338c 4 292 0 +3390 4 292 0 +3394 8 292 0 +339c 4 294 0 +33a0 c 290 0 +33ac 4 290 0 +33b0 8 295 0 +33b8 4 296 0 +33bc c 296 0 +FUNC 33c8 d8 0 run_threads +33c8 20 501 0 +33e8 4 503 0 +33ec 4 503 0 +33f0 4 503 0 +33f4 c 503 0 +3400 4 504 0 +3404 8 504 0 +340c 8 504 0 +3414 8 504 0 +341c 4 505 0 +3420 c 503 0 +342c 4 503 0 +3430 4 506 0 +3434 4 506 0 +3438 4 506 0 +343c c 506 0 +3448 4 507 0 +344c 8 507 0 +3454 8 507 0 +345c 4 508 0 +3460 c 506 0 +346c 4 506 0 +3470 20 509 0 +3490 10 509 0 +FUNC 34a0 120 0 create_debug_crumb +34a0 c 403 0 +34ac 4 404 0 +34b0 10 404 0 +34c0 10 406 0 +34d0 14 405 0 +34e4 10 408 0 +34f4 14 407 0 +3508 8 413 0 +3510 10 415 0 +3520 14 414 0 +3534 10 417 0 +3544 14 416 0 +3558 c 419 0 +3564 14 418 0 +3578 10 420 0 +3588 14 420 0 +359c 14 421 0 +35b0 4 422 0 +35b4 c 422 0 +FUNC 35c0 4c 0 trigger_oom +35c0 8 386 0 +35c8 8 387 0 +35d0 4 388 0 +35d4 4 389 0 +35d8 4 389 0 +35dc 4 389 0 +35e0 4 390 0 +35e4 8 390 0 +35ec c 394 0 +35f8 4 396 0 +35fc c 397 0 +3608 4 388 0 +FUNC 360c 24 0 trigger_crash +360c 4 367 0 +3610 18 373 0 +3628 8 375 0 +FUNC 3630 50 0 trigger_stack_overflow +3630 c 379 0 +363c 10 380 0 +364c 4 381 0 +3650 20 382 0 +3670 10 382 0 +PUBLIC 0 0 _mh_execute_header +PUBLIC c000 0 invalid_mem +STACK CFI INIT d98 24 .cfa: sp 0 + .ra: x30 diff --git a/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym.original b/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym.original new file mode 100644 index 000000000..5a6945c71 --- /dev/null +++ b/tests/fixtures/symbols/sentry_example/73781EDEBF5B34EC81B2749A0F1FA5FD0/sentry_example.sym.original @@ -0,0 +1,1232 @@ +MODULE mac arm64 73781EDEBF5B34EC81B2749A0F1FA5FD0 sentry_example +FILE 0 /Users/sentry/code/sentry-native/examples/example.c +FUNC d98 24 0 get_current_thread_id +d98 8 46 0 +da0 c 48 0 +dac 4 49 0 +db0 c 49 0 +FUNC dbc 78 0 log_thread_func +dbc c 478 0 +dc8 4 480 0 +dcc 4 480 0 +dd0 4 480 0 +dd4 c 480 0 +de0 8 482 0 +de8 8 482 0 +df0 18 481 0 +e08 8 483 0 +e10 4 484 0 +e14 c 480 0 +e20 4 480 0 +e24 4 485 0 +e28 c 485 0 +FUNC e34 6c 0 metric_thread_func +e34 c 490 0 +e40 4 492 0 +e44 4 492 0 +e48 4 492 0 +e4c c 492 0 +e58 8 493 0 +e60 14 493 0 +e74 8 494 0 +e7c 4 495 0 +e80 c 492 0 +e8c 4 492 0 +e90 4 496 0 +e94 c 496 0 +FUNC ea0 1d9c 0 main +ea0 30 514 0 +ed0 4 515 0 +ed4 4 515 0 +ed8 4 517 0 +edc 4 517 0 +ee0 c 517 0 +eec 8 517 0 +ef4 4 518 0 +ef8 8 518 0 +f00 4 519 0 +f04 4 523 0 +f08 c 523 0 +f14 4 525 0 +f18 8 525 0 +f20 4 526 0 +f24 8 526 0 +f2c 4 528 0 +f30 c 528 0 +f3c 4 530 0 +f40 4 530 0 +f44 c 530 0 +f50 8 530 0 +f58 4 531 0 +f5c c 531 0 +f68 4 532 0 +f6c 4 534 0 +f70 4 534 0 +f74 c 534 0 +f80 8 534 0 +f88 4 535 0 +f8c 8 535 0 +f94 4 536 0 +f98 4 538 0 +f9c 4 538 0 +fa0 c 538 0 +fac 8 538 0 +fb4 4 541 0 +fb8 c 541 0 +fc4 4 542 0 +fc8 4 544 0 +fcc 4 544 0 +fd0 c 544 0 +fdc 8 544 0 +fe4 8 546 0 +fec 14 546 0 +1000 4 545 0 +1004 4 547 0 +1008 4 549 0 +100c 4 549 0 +1010 c 549 0 +101c 8 549 0 +1024 4 550 0 +1028 8 550 0 +1030 4 551 0 +1034 4 553 0 +1038 4 553 0 +103c c 553 0 +1048 8 553 0 +1050 4 554 0 +1054 8 554 0 +105c 4 555 0 +1060 4 557 0 +1064 4 557 0 +1068 c 557 0 +1074 8 557 0 +107c 4 558 0 +1080 10 558 0 +1090 4 559 0 +1094 4 561 0 +1098 4 561 0 +109c c 561 0 +10a8 8 561 0 +10b0 4 563 0 +10b4 10 562 0 +10c4 4 564 0 +10c8 4 566 0 +10cc 4 566 0 +10d0 c 566 0 +10dc 8 566 0 +10e4 4 567 0 +10e8 10 567 0 +10f8 4 568 0 +10fc 4 570 0 +1100 4 570 0 +1104 c 570 0 +1110 8 570 0 +1118 4 572 0 +111c 10 571 0 +112c 4 573 0 +1130 4 575 0 +1134 4 575 0 +1138 c 575 0 +1144 8 575 0 +114c 4 577 0 +1150 10 576 0 +1160 4 578 0 +1164 4 580 0 +1168 4 580 0 +116c c 580 0 +1178 8 580 0 +1180 4 582 0 +1184 10 581 0 +1194 4 583 0 +1198 4 585 0 +119c 4 585 0 +11a0 c 585 0 +11ac 8 585 0 +11b4 4 587 0 +11b8 10 586 0 +11c8 4 588 0 +11cc 4 590 0 +11d0 4 590 0 +11d4 c 590 0 +11e0 8 590 0 +11e8 4 592 0 +11ec 10 591 0 +11fc 4 593 0 +1200 4 595 0 +1204 4 595 0 +1208 c 595 0 +1214 8 595 0 +121c 4 597 0 +1220 10 596 0 +1230 4 598 0 +1234 4 600 0 +1238 4 600 0 +123c c 600 0 +1248 8 600 0 +1250 4 601 0 +1254 c 601 0 +1260 4 602 0 +1264 4 604 0 +1268 4 604 0 +126c c 604 0 +1278 8 604 0 +1280 8 0 0 +1288 30 606 0 +12b8 4 608 0 +12bc 4 608 0 +12c0 4 609 0 +12c4 4 610 0 +12c8 4 610 0 +12cc c 610 0 +12d8 8 610 0 +12e0 8 0 0 +12e8 34 612 0 +131c 4 614 0 +1320 4 614 0 +1324 4 615 0 +1328 4 616 0 +132c 4 616 0 +1330 c 616 0 +133c 8 616 0 +1344 8 0 0 +134c 30 618 0 +137c 4 620 0 +1380 4 620 0 +1384 4 621 0 +1388 4 622 0 +138c 4 622 0 +1390 c 622 0 +139c 8 622 0 +13a4 4 623 0 +13a8 c 623 0 +13b4 4 624 0 +13b8 4 625 0 +13bc 4 625 0 +13c0 c 625 0 +13cc 8 625 0 +13d4 8 0 0 +13dc 30 627 0 +140c 4 629 0 +1410 4 629 0 +1414 4 630 0 +1418 4 632 0 +141c 4 632 0 +1420 c 632 0 +142c 8 632 0 +1434 4 633 0 +1438 8 633 0 +1440 4 634 0 +1444 4 636 0 +1448 4 636 0 +144c c 636 0 +1458 8 636 0 +1460 4 639 0 +1464 c 639 0 +1470 4 640 0 +1474 4 642 0 +1478 4 642 0 +147c c 642 0 +1488 8 642 0 +1490 4 644 0 +1494 10 644 0 +14a4 4 645 0 +14a8 4 647 0 +14ac 4 647 0 +14b0 c 647 0 +14bc 8 647 0 +14c4 4 649 0 +14c8 8 649 0 +14d0 4 650 0 +14d4 4 652 0 +14d8 4 652 0 +14dc c 652 0 +14e8 8 652 0 +14f0 4 654 0 +14f4 8 654 0 +14fc 4 655 0 +1500 4 657 0 +1504 4 657 0 +1508 c 657 0 +1514 8 657 0 +151c 4 658 0 +1520 8 658 0 +1528 4 659 0 +152c 4 661 0 +1530 4 661 0 +1534 c 661 0 +1540 8 661 0 +1548 4 667 0 +154c c 666 0 +1558 4 669 0 +155c 4 670 0 +1560 4 670 0 +1564 c 670 0 +1570 8 670 0 +1578 4 671 0 +157c 8 671 0 +1584 4 672 0 +1588 4 673 0 +158c 4 673 0 +1590 c 673 0 +159c 8 673 0 +15a4 4 674 0 +15a8 8 674 0 +15b0 4 675 0 +15b4 8 675 0 +15bc 4 676 0 +15c0 c 676 0 +15cc 4 677 0 +15d0 8 677 0 +15d8 4 678 0 +15dc 4 680 0 +15e0 4 680 0 +15e4 c 680 0 +15f0 8 680 0 +15f8 4 681 0 +15fc 8 681 0 +1604 4 682 0 +1608 4 684 0 +160c 4 684 0 +1610 c 684 0 +161c 8 684 0 +1624 4 686 0 +1628 10 685 0 +1638 4 687 0 +163c 4 689 0 +1640 4 689 0 +1644 c 689 0 +1650 8 689 0 +1658 4 691 0 +165c 10 690 0 +166c 4 692 0 +1670 4 694 0 +1674 4 694 0 +1678 c 694 0 +1684 8 694 0 +168c 4 696 0 +1690 10 695 0 +16a0 4 697 0 +16a4 4 699 0 +16a8 4 699 0 +16ac c 699 0 +16b8 8 699 0 +16c0 4 701 0 +16c4 10 700 0 +16d4 4 702 0 +16d8 4 704 0 +16dc 4 704 0 +16e0 c 704 0 +16ec 8 704 0 +16f4 4 705 0 +16f8 4 705 0 +16fc c 705 0 +1708 4 705 0 +170c 4 706 0 +1710 8 706 0 +1718 4 707 0 +171c c 707 0 +1728 8 707 0 +1730 4 709 0 +1734 8 708 0 +173c 4 710 0 +1740 4 710 0 +1744 c 710 0 +1750 8 710 0 +1758 4 712 0 +175c 8 711 0 +1764 4 713 0 +1768 4 713 0 +176c c 713 0 +1778 8 713 0 +1780 4 715 0 +1784 8 714 0 +178c 4 716 0 +1790 8 0 0 +1798 4 717 0 +179c 4 718 0 +17a0 10 721 0 +17b0 4 722 0 +17b4 4 722 0 +17b8 c 722 0 +17c4 8 722 0 +17cc 18 723 0 +17e4 8 724 0 +17ec 4 725 0 +17f0 4 727 0 +17f4 4 727 0 +17f8 8 727 0 +1800 c 728 0 +180c 4 731 0 +1810 4 731 0 +1814 c 731 0 +1820 8 731 0 +1828 c 733 0 +1834 14 733 0 +1848 10 732 0 +1858 10 735 0 +1868 c 735 0 +1874 10 734 0 +1884 20 737 0 +18a4 c 737 0 +18b0 1c 736 0 +18cc c 740 0 +18d8 c 739 0 +18e4 10 738 0 +18f4 8 741 0 +18fc 10 742 0 +190c c 742 0 +1918 10 743 0 +1928 10 743 0 +1938 c 745 0 +1944 14 744 0 +1958 c 749 0 +1964 c 748 0 +1970 10 747 0 +1980 4 750 0 +1984 4 753 0 +1988 8 753 0 +1990 14 754 0 +19a4 18 755 0 +19bc 14 756 0 +19d0 c 757 0 +19dc 4 757 0 +19e0 4 758 0 +19e4 4 760 0 +19e8 4 760 0 +19ec c 760 0 +19f8 8 760 0 +1a00 8 761 0 +1a08 10 763 0 +1a18 14 762 0 +1a2c c 765 0 +1a38 14 764 0 +1a4c c 767 0 +1a58 14 766 0 +1a6c 14 768 0 +1a80 14 769 0 +1a94 14 770 0 +1aa8 20 772 0 +1ac8 8 776 0 +1ad0 24 775 0 +1af4 8 778 0 +1afc 14 780 0 +1b10 c 779 0 +1b1c 14 782 0 +1b30 c 781 0 +1b3c 14 783 0 +1b50 14 785 0 +1b64 18 787 0 +1b7c 4 789 0 +1b80 4 791 0 +1b84 4 791 0 +1b88 c 791 0 +1b94 8 791 0 +1b9c 18 793 0 +1bb4 4 792 0 +1bb8 4 794 0 +1bbc c 794 0 +1bc8 4 795 0 +1bcc 4 797 0 +1bd0 4 797 0 +1bd4 8 797 0 +1bdc 4 798 0 +1be0 4 798 0 +1be4 c 798 0 +1bf0 8 798 0 +1bf8 c 799 0 +1c04 4 800 0 +1c08 4 801 0 +1c0c 4 801 0 +1c10 c 801 0 +1c1c 8 801 0 +1c24 4 802 0 +1c28 4 802 0 +1c2c 4 802 0 +1c30 c 802 0 +1c3c 4 803 0 +1c40 14 803 0 +1c54 4 804 0 +1c58 c 802 0 +1c64 4 802 0 +1c68 8 806 0 +1c70 c 808 0 +1c7c 4 809 0 +1c80 4 810 0 +1c84 4 810 0 +1c88 c 810 0 +1c94 8 810 0 +1c9c c 811 0 +1ca8 4 812 0 +1cac 4 813 0 +1cb0 4 815 0 +1cb4 4 815 0 +1cb8 8 815 0 +1cc0 4 816 0 +1cc4 4 816 0 +1cc8 c 816 0 +1cd4 8 816 0 +1cdc 8 817 0 +1ce4 14 817 0 +1cf8 4 818 0 +1cfc 4 819 0 +1d00 4 819 0 +1d04 c 819 0 +1d10 8 819 0 +1d18 8 820 0 +1d20 14 820 0 +1d34 8 822 0 +1d3c 24 821 0 +1d60 8 824 0 +1d68 2c 823 0 +1d94 4 825 0 +1d98 4 826 0 +1d9c 4 826 0 +1da0 c 826 0 +1dac 8 826 0 +1db4 8 827 0 +1dbc 10 829 0 +1dcc 10 828 0 +1ddc 14 830 0 +1df0 14 831 0 +1e04 4 832 0 +1e08 4 833 0 +1e0c 4 833 0 +1e10 c 833 0 +1e1c 8 833 0 +1e24 4 834 0 +1e28 4 834 0 +1e2c 4 834 0 +1e30 c 834 0 +1e3c 8 836 0 +1e44 14 835 0 +1e58 4 837 0 +1e5c c 834 0 +1e68 4 834 0 +1e6c 8 838 0 +1e74 8 840 0 +1e7c 14 839 0 +1e90 4 841 0 +1e94 4 842 0 +1e98 4 842 0 +1e9c c 842 0 +1ea8 8 842 0 +1eb0 c 843 0 +1ebc 4 844 0 +1ec0 4 845 0 +1ec4 4 847 0 +1ec8 4 847 0 +1ecc c 847 0 +1ed8 8 847 0 +1ee0 c 848 0 +1eec 14 849 0 +1f00 8 850 0 +1f08 10 850 0 +1f18 10 853 0 +1f28 14 851 0 +1f3c 1c 854 0 +1f58 8 855 0 +1f60 4 856 0 +1f64 14 858 0 +1f78 8 860 0 +1f80 14 859 0 +1f94 10 862 0 +1fa4 18 861 0 +1fbc 8 863 0 +1fc4 24 866 0 +1fe8 c 867 0 +1ff4 10 870 0 +2004 8 871 0 +200c 10 873 0 +201c c 874 0 +2028 10 877 0 +2038 10 879 0 +2048 14 878 0 +205c 8 880 0 +2064 4 881 0 +2068 4 883 0 +206c 4 883 0 +2070 c 883 0 +207c 8 883 0 +2084 c 884 0 +2090 c 885 0 +209c 4 886 0 +20a0 4 886 0 +20a4 4 886 0 +20a8 4 887 0 +20ac 4 889 0 +20b0 4 889 0 +20b4 c 889 0 +20c0 8 889 0 +20c8 c 892 0 +20d4 18 894 0 +20ec 4 893 0 +20f0 4 895 0 +20f4 c 895 0 +2100 4 896 0 +2104 4 898 0 +2108 4 898 0 +210c c 898 0 +2118 8 898 0 +2120 c 899 0 +212c c 900 0 +2138 4 901 0 +213c 4 903 0 +2140 4 903 0 +2144 c 903 0 +2150 8 903 0 +2158 4 904 0 +215c 4 905 0 +2160 4 907 0 +2164 4 907 0 +2168 c 907 0 +2174 8 907 0 +217c 4 908 0 +2180 4 908 0 +2184 4 908 0 +2188 c 908 0 +2194 30 910 0 +21c4 c 911 0 +21d0 8 911 0 +21d8 4 912 0 +21dc c 908 0 +21e8 4 908 0 +21ec 4 913 0 +21f0 4 915 0 +21f4 4 915 0 +21f8 c 915 0 +2204 8 915 0 +220c 4 916 0 +2210 4 917 0 +2214 4 919 0 +2218 4 919 0 +221c c 919 0 +2228 8 919 0 +2230 4 920 0 +2234 4 920 0 +2238 24 922 0 +225c 10 926 0 +226c 4 927 0 +2270 8 927 0 +2278 10 929 0 +2288 4 930 0 +228c 8 930 0 +2294 4 932 0 +2298 4 932 0 +229c c 932 0 +22a8 8 932 0 +22b0 4 935 0 +22b4 c 935 0 +22c0 4 937 0 +22c4 18 936 0 +22dc 4 936 0 +22e0 4 939 0 +22e4 c 938 0 +22f0 4 940 0 +22f4 4 942 0 +22f8 14 942 0 +230c 4 943 0 +2310 4 945 0 +2314 4 945 0 +2318 c 945 0 +2324 8 945 0 +232c 4 946 0 +2330 4 946 0 +2334 4 946 0 +2338 c 946 0 +2344 38 948 0 +237c c 950 0 +2388 14 952 0 +239c 4 953 0 +23a0 c 946 0 +23ac 4 946 0 +23b0 4 954 0 +23b4 4 956 0 +23b8 4 956 0 +23bc c 956 0 +23c8 8 956 0 +23d0 4 957 0 +23d4 4 958 0 +23d8 4 960 0 +23dc 4 960 0 +23e0 c 960 0 +23ec 8 960 0 +23f4 8 961 0 +23fc 4 962 0 +2400 4 964 0 +2404 4 964 0 +2408 c 964 0 +2414 8 964 0 +241c 8 965 0 +2424 4 966 0 +2428 4 968 0 +242c 4 968 0 +2430 c 968 0 +243c 8 968 0 +2444 c 970 0 +2450 c 971 0 +245c 4 971 0 +2460 4 972 0 +2464 4 974 0 +2468 4 974 0 +246c c 974 0 +2478 8 974 0 +2480 4 975 0 +2484 4 976 0 +2488 4 977 0 +248c 4 977 0 +2490 c 977 0 +249c 8 977 0 +24a4 4 978 0 +24a8 4 979 0 +24ac 4 980 0 +24b0 4 980 0 +24b4 c 980 0 +24c0 8 980 0 +24c8 4 981 0 +24cc 4 982 0 +24d0 4 992 0 +24d4 4 992 0 +24d8 c 992 0 +24e4 8 992 0 +24ec 20 993 0 +250c 4 995 0 +2510 4 995 0 +2514 c 995 0 +2520 8 995 0 +2528 4 1000 0 +252c 4 1003 0 +2530 4 1003 0 +2534 c 1003 0 +2540 8 1003 0 +2548 8 1004 0 +2550 4 1005 0 +2554 4 1006 0 +2558 4 1006 0 +255c c 1006 0 +2568 8 1006 0 +2570 4 1007 0 +2574 8 1007 0 +257c 4 1008 0 +2580 4 1011 0 +2584 4 1011 0 +2588 c 1011 0 +2594 8 1011 0 +259c 1c 1012 0 +25b8 4 1014 0 +25bc 4 1014 0 +25c0 c 1014 0 +25cc 8 1014 0 +25d4 4 1016 0 +25d8 10 1016 0 +25e8 10 1017 0 +25f8 c 1018 0 +2604 4 1019 0 +2608 14 1020 0 +261c 4 1021 0 +2620 4 1022 0 +2624 4 1022 0 +2628 c 1022 0 +2634 8 1022 0 +263c 18 1023 0 +2654 4 1025 0 +2658 4 1025 0 +265c c 1025 0 +2668 8 1025 0 +2670 10 1026 0 +2680 4 1027 0 +2684 8 1028 0 +268c c 1029 0 +2698 14 1031 0 +26ac 4 1032 0 +26b0 4 1033 0 +26b4 4 1033 0 +26b8 c 1033 0 +26c4 8 1033 0 +26cc 24 1034 0 +26f0 8 1037 0 +26f8 4 1038 0 +26fc 4 1039 0 +2700 4 1039 0 +2704 c 1039 0 +2710 8 1039 0 +2718 24 1040 0 +273c 4 1044 0 +2740 4 1044 0 +2744 c 1047 0 +2750 4 1048 0 +2754 c 1048 0 +2760 4 1048 0 +2764 4 1049 0 +2768 8 1049 0 +2770 4 1050 0 +2774 c 1050 0 +2780 4 1051 0 +2784 4 1051 0 +2788 4 1052 0 +278c 4 1055 0 +2790 4 1055 0 +2794 4 1055 0 +2798 c 1058 0 +27a4 8 1060 0 +27ac 8 1060 0 +27b4 4 1060 0 +27b8 10 1060 0 +27c8 c 1059 0 +27d4 4 1063 0 +27d8 8 1063 0 +27e0 4 1066 0 +27e4 4 1066 0 +27e8 4 1067 0 +27ec 4 1068 0 +27f0 4 1068 0 +27f4 c 1068 0 +2800 8 1068 0 +2808 1c 1069 0 +2824 1c 1071 0 +2840 20 1074 0 +2860 8 1077 0 +2868 4 1079 0 +286c 4 1081 0 +2870 4 1081 0 +2874 c 1081 0 +2880 8 1081 0 +2888 14 1083 0 +289c 4 1082 0 +28a0 4 1086 0 +28a4 4 1086 0 +28a8 c 1086 0 +28b4 8 1086 0 +28bc 4 1087 0 +28c0 8 1087 0 +28c8 4 1088 0 +28cc 8 1090 0 +28d4 c 1092 0 +28e0 14 1091 0 +28f4 4 1094 0 +28f8 4 1094 0 +28fc c 1094 0 +2908 8 1094 0 +2910 c 1095 0 +291c 4 1098 0 +2920 4 1098 0 +2924 c 1097 0 +2930 4 1099 0 +2934 4 1102 0 +2938 8 1102 0 +2940 4 1101 0 +2944 8 1105 0 +294c 18 1105 0 +2964 10 1104 0 +2974 4 1107 0 +2978 4 1107 0 +297c c 1107 0 +2988 8 1107 0 +2990 4 1109 0 +2994 8 1108 0 +299c 4 1110 0 +29a0 4 1112 0 +29a4 4 1112 0 +29a8 c 1112 0 +29b4 8 1112 0 +29bc 4 1114 0 +29c0 18 1114 0 +29d8 4 1113 0 +29dc 4 1116 0 +29e0 c 1116 0 +29ec 4 1115 0 +29f0 8 1119 0 +29f8 18 1119 0 +2a10 10 1118 0 +2a20 4 1121 0 +2a24 4 1121 0 +2a28 c 1121 0 +2a34 8 1121 0 +2a3c 4 1122 0 +2a40 8 1122 0 +2a48 4 1124 0 +2a4c 8 1123 0 +2a54 4 1125 0 +2a58 4 1127 0 +2a5c 4 1127 0 +2a60 4 1128 0 +2a64 4 1128 0 +2a68 4 1129 0 +2a6c 4 1131 0 +2a70 4 1131 0 +2a74 c 1131 0 +2a80 8 1131 0 +2a88 4 1132 0 +2a8c 4 1132 0 +2a90 1c 1133 0 +2aac 14 1135 0 +2ac0 4 1136 0 +2ac4 4 1136 0 +2ac8 c 1136 0 +2ad4 8 1136 0 +2adc c 1137 0 +2ae8 4 1138 0 +2aec 4 1139 0 +2af0 4 1139 0 +2af4 c 1139 0 +2b00 8 1139 0 +2b08 8 1141 0 +2b10 14 1140 0 +2b24 4 1142 0 +2b28 4 1143 0 +2b2c 4 1145 0 +2b30 10 1145 0 +2b40 4 1146 0 +2b44 4 1146 0 +2b48 c 1146 0 +2b54 8 1146 0 +2b5c c 1147 0 +2b68 4 1148 0 +2b6c 4 1149 0 +2b70 4 1151 0 +2b74 4 1151 0 +2b78 c 1151 0 +2b84 8 1151 0 +2b8c 18 1152 0 +2ba4 4 1153 0 +2ba8 4 1156 0 +2bac 4 1158 0 +2bb0 4 1158 0 +2bb4 c 1158 0 +2bc0 8 1158 0 +2bc8 8 1159 0 +2bd0 4 1160 0 +2bd4 4 1162 0 +2bd8 4 1162 0 +2bdc c 1162 0 +2be8 8 1162 0 +2bf0 4 1163 0 +2bf4 4 1164 0 +2bf8 8 1166 0 +2c00 28 1167 0 +2c28 4 0 0 +2c2c 10 1167 0 +FUNC 2c3c a0 0 has_arg +2c3c 14 257 0 +2c50 8 258 0 +2c58 4 258 0 +2c5c 4 258 0 +2c60 4 258 0 +2c64 c 258 0 +2c70 4 259 0 +2c74 4 259 0 +2c78 4 259 0 +2c7c 4 259 0 +2c80 4 259 0 +2c84 8 259 0 +2c8c 4 0 0 +2c90 10 260 0 +2ca0 4 262 0 +2ca4 c 258 0 +2cb0 4 258 0 +2cb4 4 0 0 +2cb8 10 263 0 +2cc8 8 264 0 +2cd0 c 264 0 +FUNC 2cdc 58 0 print_envelope +2cdc 14 246 0 +2cf0 4 248 0 +2cf4 4 249 0 +2cf8 4 249 0 +2cfc 4 249 0 +2d00 4 250 0 +2d04 14 250 0 +2d18 4 251 0 +2d1c 4 251 0 +2d20 4 252 0 +2d24 4 252 0 +2d28 c 253 0 +FUNC 2d34 50 0 before_send_callback +2d34 14 93 0 +2d48 10 99 0 +2d58 14 98 0 +2d6c 8 102 0 +2d74 4 102 0 +2d78 c 102 0 +FUNC 2d84 34 0 discarding_before_send_callback +2d84 14 108 0 +2d98 8 113 0 +2da0 8 114 0 +2da8 4 114 0 +2dac c 114 0 +FUNC 2db8 24 0 on_crash_callback +2db8 10 132 0 +2dc8 8 137 0 +2dd0 4 137 0 +2dd4 8 137 0 +FUNC 2ddc 34 0 discarding_on_crash_callback +2ddc 14 120 0 +2df0 8 125 0 +2df8 8 126 0 +2e00 4 126 0 +2e04 c 126 0 +FUNC 2e10 4c 0 before_transaction_callback +2e10 10 142 0 +2e20 10 146 0 +2e30 14 145 0 +2e44 8 147 0 +2e4c 4 147 0 +2e50 c 147 0 +FUNC 2e5c 64 0 discarding_before_transaction_callback +2e5c 10 152 0 +2e6c 14 155 0 +2e80 8 155 0 +2e88 8 155 0 +2e90 8 156 0 +2e98 8 157 0 +2ea0 4 157 0 +2ea4 8 159 0 +2eac 4 159 0 +2eb0 4 160 0 +2eb4 c 160 0 +FUNC 2ec0 70 0 before_send_log_callback +2ec0 10 164 0 +2ed0 10 167 0 +2ee0 10 167 0 +2ef0 14 168 0 +2f04 14 168 0 +2f18 8 170 0 +2f20 4 170 0 +2f24 c 170 0 +FUNC 2f30 78 0 discarding_before_send_log_callback +2f30 10 175 0 +2f40 14 178 0 +2f54 14 178 0 +2f68 8 177 0 +2f70 8 177 0 +2f78 8 180 0 +2f80 8 181 0 +2f88 4 181 0 +2f8c 8 183 0 +2f94 4 183 0 +2f98 4 184 0 +2f9c c 184 0 +FUNC 2fa8 e8 0 traces_sampler_callback +2fa8 18 66 0 +2fc0 4 69 0 +2fc4 8 69 0 +2fcc 4 70 0 +2fd0 4 70 0 +2fd4 8 70 0 +2fdc 18 71 0 +2ff4 c 73 0 +3000 4 75 0 +3004 4 75 0 +3008 c 75 0 +3014 8 75 0 +301c 4 78 0 +3020 4 78 0 +3024 c 78 0 +3030 8 78 0 +3038 14 82 0 +304c 8 81 0 +3054 c 81 0 +3060 c 84 0 +306c 4 86 0 +3070 4 87 0 +3074 c 88 0 +3080 4 89 0 +3084 c 89 0 +FUNC 3090 e0 0 make_proxy_url +3090 24 274 0 +30b4 4 275 0 +30b8 4 275 0 +30bc 4 275 0 +30c0 4 276 0 +30c4 8 276 0 +30cc 4 277 0 +30d0 4 277 0 +30d4 4 277 0 +30d8 4 279 0 +30dc 8 279 0 +30e4 40 280 0 +3124 4 282 0 +3128 3c 283 0 +3164 c 285 0 +FUNC 3170 a4 0 test_logger_callback +3170 2c 232 0 +319c 24 237 0 +31c0 14 240 0 +31d4 c 241 0 +31e0 4 241 0 +31e4 20 242 0 +3204 10 242 0 +FUNC 3214 70 0 before_send_metric_callback +3214 10 188 0 +3224 10 191 0 +3234 10 191 0 +3244 14 192 0 +3258 14 192 0 +326c 8 194 0 +3274 4 194 0 +3278 c 194 0 +FUNC 3284 30 0 discarding_before_send_metric_callback +3284 10 199 0 +3294 8 201 0 +329c 8 202 0 +32a4 4 202 0 +32a8 c 202 0 +FUNC 32b4 4c 0 before_breadcrumb_callback +32b4 10 207 0 +32c4 10 212 0 +32d4 14 211 0 +32e8 8 214 0 +32f0 4 214 0 +32f4 c 214 0 +FUNC 3300 30 0 discarding_before_breadcrumb_callback +3300 10 220 0 +3310 8 224 0 +3318 8 225 0 +3320 4 225 0 +3324 c 225 0 +FUNC 3330 98 0 get_arg_value +3330 14 289 0 +3344 8 290 0 +334c 4 290 0 +3350 4 290 0 +3354 4 290 0 +3358 4 290 0 +335c c 290 0 +3368 4 291 0 +336c 4 291 0 +3370 4 291 0 +3374 4 291 0 +3378 4 291 0 +337c 8 291 0 +3384 4 292 0 +3388 4 292 0 +338c 4 292 0 +3390 4 292 0 +3394 8 292 0 +339c 4 294 0 +33a0 c 290 0 +33ac 4 290 0 +33b0 8 295 0 +33b8 4 296 0 +33bc c 296 0 +FUNC 33c8 d8 0 run_threads +33c8 20 501 0 +33e8 4 503 0 +33ec 4 503 0 +33f0 4 503 0 +33f4 c 503 0 +3400 4 504 0 +3404 8 504 0 +340c 8 504 0 +3414 8 504 0 +341c 4 505 0 +3420 c 503 0 +342c 4 503 0 +3430 4 506 0 +3434 4 506 0 +3438 4 506 0 +343c c 506 0 +3448 4 507 0 +344c 8 507 0 +3454 8 507 0 +345c 4 508 0 +3460 c 506 0 +346c 4 506 0 +3470 20 509 0 +3490 10 509 0 +FUNC 34a0 120 0 create_debug_crumb +34a0 c 403 0 +34ac 4 404 0 +34b0 10 404 0 +34c0 10 406 0 +34d0 14 405 0 +34e4 10 408 0 +34f4 14 407 0 +3508 8 413 0 +3510 10 415 0 +3520 14 414 0 +3534 10 417 0 +3544 14 416 0 +3558 c 419 0 +3564 14 418 0 +3578 10 420 0 +3588 14 420 0 +359c 14 421 0 +35b0 4 422 0 +35b4 c 422 0 +FUNC 35c0 4c 0 trigger_oom +35c0 8 386 0 +35c8 8 387 0 +35d0 4 388 0 +35d4 4 389 0 +35d8 4 389 0 +35dc 4 389 0 +35e0 4 390 0 +35e4 8 390 0 +35ec c 394 0 +35f8 4 396 0 +35fc c 397 0 +3608 4 388 0 +FUNC 360c 24 0 trigger_crash +360c 4 367 0 +3610 18 373 0 +3628 8 375 0 +FUNC 3630 50 0 trigger_stack_overflow +3630 c 379 0 +363c 10 380 0 +364c 4 381 0 +3650 20 382 0 +3670 10 382 0 +PUBLIC 0 0 _mh_execute_header +PUBLIC c000 0 invalid_mem +STACK CFI INIT d98 24 .cfa: sp 0 + .ra: x30 +STACK CFI da0 .cfa: sp 32 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT dbc 78 .cfa: sp 0 + .ra: x30 +STACK CFI dc4 .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT e34 6c .cfa: sp 0 + .ra: x30 +STACK CFI e3c .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT ea0 1d9c .cfa: sp 0 + .ra: x30 +STACK CFI eac .cfa: sp 1664 + .ra: .cfa -8 + ^ x27: .cfa -24 + ^ x28: .cfa -32 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2c3c a0 .cfa: sp 0 + .ra: x30 +STACK CFI 2c44 .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2cdc 58 .cfa: sp 0 + .ra: x30 +STACK CFI 2ce4 .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2d34 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2d3c .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2d84 34 .cfa: sp 0 + .ra: x30 +STACK CFI 2d8c .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2ddc 34 .cfa: sp 0 + .ra: x30 +STACK CFI 2de4 .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2e10 4c .cfa: sp 0 + .ra: x30 +STACK CFI 2e18 .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2e5c 64 .cfa: sp 0 + .ra: x30 +STACK CFI 2e64 .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2ec0 70 .cfa: sp 0 + .ra: x30 +STACK CFI 2ec8 .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2f30 78 .cfa: sp 0 + .ra: x30 +STACK CFI 2f38 .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 2fa8 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 2fb0 .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 3090 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 3098 .cfa: sp 112 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 3170 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 317c .cfa: sp 1120 + .ra: .cfa -8 + ^ x27: .cfa -24 + ^ x28: .cfa -32 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 3214 70 .cfa: sp 0 + .ra: x30 +STACK CFI 321c .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 3284 30 .cfa: sp 0 + .ra: x30 +STACK CFI 328c .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 32b4 4c .cfa: sp 0 + .ra: x30 +STACK CFI 32bc .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 3300 30 .cfa: sp 0 + .ra: x30 +STACK CFI 3308 .cfa: sp 48 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 3330 98 .cfa: sp 0 + .ra: x30 +STACK CFI 3338 .cfa: sp 64 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 33c8 d8 .cfa: sp 0 + .ra: x30 +STACK CFI 33d4 .cfa: sp 464 + .ra: .cfa -8 + ^ x27: .cfa -24 + ^ x28: .cfa -32 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 34a0 120 .cfa: sp 0 + .ra: x30 +STACK CFI 34a8 .cfa: sp 96 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 35c0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 35c8 .cfa: sp 32 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 360c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3610 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 3630 50 .cfa: sp 0 + .ra: x30 +STACK CFI 363c .cfa: sp 1072 + .ra: .cfa -8 + ^ x27: .cfa -24 + ^ x28: .cfa -32 + ^ x29: .cfa -16 + ^ From a7ac5484fa19f083676ef34317677977ef4c0cab Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 31 Mar 2026 16:26:37 +0200 Subject: [PATCH 09/10] Fix doc comment --- .../symbolicator-native/tests/integration/process_minidump.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/symbolicator-native/tests/integration/process_minidump.rs b/crates/symbolicator-native/tests/integration/process_minidump.rs index be8009b41..19a3b29d0 100644 --- a/crates/symbolicator-native/tests/integration/process_minidump.rs +++ b/crates/symbolicator-native/tests/integration/process_minidump.rs @@ -57,7 +57,7 @@ async fn test_minidump_macos() { /// * falling into some module, /// * for which we have CFI or debug info, /// * which doesn't cover that instruction address, -/// then that address is probably bogus. +/// then that address is probably bogus and we discard the frame. /// /// The CFI half of this heuristic was implemented in /// https://github.com/getsentry/symbolicator/pull/1651. @@ -65,7 +65,7 @@ async fn test_minidump_macos() { /// /// This test simulates an actual customer situation: we have both debug info and CFI /// for the minidump, but the CFI is truncated/poor. If we only used CFI to constrain the -/// stack scanner, all frames in `main.c` would be rejected. However, since we also use +/// stack scanner, all frames in `sentry_example` would be rejected. However, since we also use /// the (good) debug info to check the frames, they are retained. /// /// The `dyld` frames in the stacktrace are found by scanning, and since we have no CFI or From 478bf0013a901dc19921824f8d266ed9c69f9f00 Mon Sep 17 00:00:00 2001 From: Sebastian Zivota Date: Tue, 31 Mar 2026 16:35:41 +0200 Subject: [PATCH 10/10] Fix links --- .../symbolicator-native/src/symbolication/process_minidump.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/symbolicator-native/src/symbolication/process_minidump.rs b/crates/symbolicator-native/src/symbolication/process_minidump.rs index 24bdef59d..c073428ca 100644 --- a/crates/symbolicator-native/src/symbolication/process_minidump.rs +++ b/crates/symbolicator-native/src/symbolication/process_minidump.rs @@ -314,7 +314,7 @@ impl SymbolicatorSymbolProvider { /// But since the instruction maps into the range of this module, we know it cannot /// be part of a different module either -> it's not a valid instruction. /// - /// See: https://github.com/rust-minidump/rust-minidump/blob/32e01a0e54d987025aa64486ebc4154f7f6b16d2/minidump-unwind/src/lib.rs#L865-L877 + /// See: async fn check_frame_by_cfi( &self, module: &(dyn Module + Sync), @@ -354,7 +354,7 @@ impl SymbolicatorSymbolProvider { /// But since the instruction maps into the range of this module, we know it cannot /// be part of a different module either -> it's not a valid instruction. /// - /// See: https://github.com/rust-minidump/rust-minidump/blob/32e01a0e54d987025aa64486ebc4154f7f6b16d2/minidump-unwind/src/lib.rs#L865-L877 + /// See: async fn check_frame_by_symbol_info( &self, module: &(dyn Module + Sync),