diff --git a/src/commands/debug_files/bundle_sources.rs b/src/commands/debug_files/bundle_sources.rs index 6525c7d90f..a1311b1045 100644 --- a/src/commands/debug_files/bundle_sources.rs +++ b/src/commands/debug_files/bundle_sources.rs @@ -87,10 +87,6 @@ pub fn execute(matches: &ArgMatches) -> Result<()> { for (index, object) in archive.get().objects().enumerate() { let object = object?; - if object.has_sources() { - eprintln!("skipped {orig_path} (no source info)"); - continue; - } let mut out = output_path.unwrap_or(parent_path).join(filename); match index { @@ -107,7 +103,7 @@ pub fn execute(matches: &ArgMatches) -> Result<()> { let written = writer.write_object_with_filter( &object, &filename.to_string_lossy(), - |file, _source_descriptor| filter_bad_sources(file), + filter_bad_sources, )?; if !written { diff --git a/src/commands/debug_files/print_sources.rs b/src/commands/debug_files/print_sources.rs index 3a160b9d06..9fb44e290c 100644 --- a/src/commands/debug_files/print_sources.rs +++ b/src/commands/debug_files/print_sources.rs @@ -1,3 +1,4 @@ +use std::fmt; use std::path::Path; use anyhow::Result; @@ -67,9 +68,15 @@ fn print_object_sources(object: &Object) -> Result<()> { let abs_path = file.abs_path_str(); println!(" {}", &abs_path); let source = debug_session.source_by_path(abs_path.as_str())?; - match source.as_ref().and_then(|sd| sd.contents()) { + match source { Some(source) => { - println!(" Embedded, {} bytes", source.len()); + print_file_descriptor_detail( + "Embedded", + source.contents().map(|v| format!("{} bytes", v.len())), + ); + print_file_descriptor_detail("Url", source.url()); + print_file_descriptor_detail("DebugId", source.debug_id()); + print_file_descriptor_detail("SourceMap Url", source.source_mapping_url()); } None => { if Path::new(&abs_path).exists() { @@ -83,3 +90,9 @@ fn print_object_sources(object: &Object) -> Result<()> { } Ok(()) } + +fn print_file_descriptor_detail(name: &str, value: Option) { + if let Some(value) = value { + println!(" {name}: {value}"); + } +} diff --git a/src/utils/dif_upload.rs b/src/utils/dif_upload.rs index b535f1120b..16a7f2f3b2 100644 --- a/src/utils/dif_upload.rs +++ b/src/utils/dif_upload.rs @@ -25,7 +25,7 @@ use sha1_smol::Digest; use symbolic::common::{AsSelf, ByteView, DebugId, SelfCell, Uuid}; use symbolic::debuginfo::macho::{BcSymbolMap, UuidMapping}; use symbolic::debuginfo::pe::PeObject; -use symbolic::debuginfo::sourcebundle::SourceBundleWriter; +use symbolic::debuginfo::sourcebundle::{SourceBundleWriter, SourceFileDescriptor}; use symbolic::debuginfo::{Archive, FileEntry, FileFormat, Object}; use symbolic::il2cpp::ObjectLineMapping; use walkdir::WalkDir; @@ -1104,16 +1104,26 @@ fn extract_embedded_ppdb<'a>(pe: &PeObject, pe_name: &str) -> Result bool { +pub fn filter_bad_sources( + entry: &FileEntry, + embedded_source: &Option, +) -> bool { let max_size = Config::current().get_max_dif_item_size(); let path = &entry.abs_path_str(); - if entry.name_str().ends_with(".pch") { - // always ignore pch files + // Ignore pch files. + if path.ends_with(".pch") { return false; - } else if let Ok(meta) = fs::metadata(path) { + } + + // Ignore files embedded in the object itself. + if embedded_source.is_some() { + return false; + } + + // Ignore files larger than limit (defaults to `DEFAULT_MAX_DIF_ITEM_SIZE`). + if let Ok(meta) = fs::metadata(path) { let item_size = meta.len(); - // ignore files larger than limit (defaults to 1MB) if item_size > max_size { warn!( "Source exceeded maximum item size limit ({}). {}", @@ -1156,12 +1166,6 @@ fn create_source_bundles<'a>( Some(object) => object, None => continue, }; - if object.has_sources() { - // Do not create standalone source bundles if the original object already contains - // source code. This would just store duplicate information in Sentry. - debug!("skipping {} because it already embeds sources", name); - continue; - } let temp_file = TempFile::create()?; let mut writer = SourceBundleWriter::start(BufWriter::new(temp_file.open()?))?; @@ -1170,11 +1174,8 @@ fn create_source_bundles<'a>( // Resolve source files from the object and write their contents into the archive. Skip to // upload this bundle if no source could be written. This can happen if there is no file or // line information in the object file, or if none of the files could be resolved. - let written = writer.write_object_with_filter( - object, - dif.file_name(), - |file, _source_descriptor| filter_bad_sources(file), - )?; + let written = + writer.write_object_with_filter(object, dif.file_name(), filter_bad_sources)?; if !written { debug!("No sources found for {}", name); continue; diff --git a/tests/integration/_cases/debug_files/debug_files-print_sources-dll-embedded-ppdb-with-sources.trycmd b/tests/integration/_cases/debug_files/debug_files-print_sources-dll-embedded-ppdb-with-sources.trycmd index 057e45d867..43a7978dbc 100644 --- a/tests/integration/_cases/debug_files/debug_files-print_sources-dll-embedded-ppdb-with-sources.trycmd +++ b/tests/integration/_cases/debug_files/debug_files-print_sources-dll-embedded-ppdb-with-sources.trycmd @@ -4,14 +4,14 @@ $ sentry-cli debug-files print-sources tests/integration/_fixtures/Sentry.Sample pe 623535c7-c0ea-4dee-b99b-4669e99a7ecc-a878d1fa has no sources. portablepdb 623535c7-c0ea-4dee-b99b-4669e99a7ecc-a878d1fa references sources: C:/dev/sentry-dotnet/samples/Sentry.Samples.Console.Basic/Program.cs - Embedded, 204 bytes + Embedded: 204 bytes C:/dev/sentry-dotnet/samples/Sentry.Samples.Console.Basic/obj/Release/net6.0/Sentry.Samples.Console.Basic.GlobalUsings.g.cs - Embedded, 295 bytes + Embedded: 295 bytes C:/dev/sentry-dotnet/samples/Sentry.Samples.Console.Basic/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs - Embedded, 198 bytes + Embedded: 198 bytes C:/dev/sentry-dotnet/samples/Sentry.Samples.Console.Basic/obj/Release/net6.0/Sentry.Attributes.cs - Embedded, 610 bytes + Embedded: 610 bytes C:/dev/sentry-dotnet/samples/Sentry.Samples.Console.Basic/obj/Release/net6.0/Sentry.Samples.Console.Basic.AssemblyInfo.cs - Embedded, 1019 bytes + Embedded: 1019 bytes ```