11use std:: collections:: HashMap ;
2- use std:: num:: NonZeroU32 ;
32
43use samply_symbols:: {
54 FileAndPathHelper , FramesLookupResult , LibraryInfo , LookupAddress , SymbolManager ,
65} ;
76
8- use crate :: api_file_path:: to_api_file_path;
97use crate :: error:: Error ;
108use crate :: to_debug_id;
119
1210pub mod looked_up_addresses;
1311pub mod request_json;
1412pub mod response_json;
1513
16- use looked_up_addresses:: { AddressResults , LookedUpAddresses } ;
14+ use looked_up_addresses:: LookedUpAddresses ;
1715use request_json:: Lib ;
1816use serde_json:: json;
1917
@@ -36,15 +34,15 @@ impl<'a, H: FileAndPathHelper> SymbolicateApi<'a, H> {
3634
3735 pub async fn query_api_fallible_json ( & self , request_json : & str ) -> Result < String , Error > {
3836 let request: request_json:: Request = serde_json:: from_str ( request_json) ?;
39- let response = self . query_api ( & request) . await ?;
37+ let response = self . query_api ( request) . await ?;
4038 Ok ( serde_json:: to_string ( & response) ?)
4139 }
4240
4341 pub async fn query_api (
4442 & self ,
45- request : & request_json:: Request ,
43+ request : request_json:: Request ,
4644 ) -> Result < response_json:: Response , Error > {
47- let requested_addresses = gather_requested_addresses ( request) ?;
45+ let requested_addresses = gather_requested_addresses ( & request) ?;
4846 let symbolicated_addresses = self
4947 . symbolicate_requested_addresses ( requested_addresses)
5048 . await ;
@@ -157,111 +155,13 @@ fn gather_requested_addresses(
157155}
158156
159157fn create_response (
160- request : & request_json:: Request ,
158+ request : request_json:: Request ,
161159 symbolicated_addresses : HashMap < Lib , Result < LookedUpAddresses , samply_symbols:: Error > > ,
162160) -> response_json:: Response {
163- use response_json:: { DebugInfo , FrameDebugInfo , Response , Stack , StackFrame , Symbol } ;
161+ use response_json:: { Response , Results } ;
164162
165- fn result_for_job (
166- job : & request_json:: Job ,
167- symbolicated_addresses : & HashMap < Lib , Result < LookedUpAddresses , samply_symbols:: Error > > ,
168- ) -> response_json:: Result {
169- let mut found_modules = HashMap :: new ( ) ;
170- let mut module_errors = HashMap :: new ( ) ;
171- let mut symbols_by_module_index = HashMap :: new ( ) ;
172- for ( module_index, lib) in job. memory_map . iter ( ) . enumerate ( ) {
173- if let Some ( symbol_result) = symbolicated_addresses. get ( lib) {
174- let module_key = format ! ( "{}/{}" , lib. debug_name, lib. breakpad_id) ;
175- match symbol_result {
176- Ok ( symbols) => {
177- symbols_by_module_index
178- . insert ( module_index as u32 , & symbols. address_results ) ;
179- }
180- Err ( err) => {
181- module_errors. insert ( module_key. clone ( ) , vec ! [ err. into( ) ] ) ;
182- }
183- }
184- found_modules. insert ( module_key, symbol_result. is_ok ( ) ) ;
185- }
186- }
187-
188- let stacks = job. stacks . iter ( ) . map ( |stack| {
189- response_stack_for_request_stack ( stack, & job. memory_map , & symbols_by_module_index)
190- } ) ;
191-
192- response_json:: Result {
193- stacks : stacks. collect ( ) ,
194- found_modules,
195- module_errors,
196- }
197- }
198-
199- fn response_stack_for_request_stack (
200- stack : & request_json:: Stack ,
201- memory_map : & [ Lib ] ,
202- symbols_by_module_index : & HashMap < u32 , & AddressResults > ,
203- ) -> Stack {
204- let frames = stack. 0 . iter ( ) . enumerate ( ) . map ( |( frame_index, frame) | {
205- response_frame_for_request_frame (
206- frame,
207- frame_index as u32 ,
208- memory_map,
209- symbols_by_module_index,
210- )
211- } ) ;
212- Stack ( frames. collect ( ) )
213- }
214-
215- fn response_frame_for_request_frame (
216- frame : & request_json:: StackFrame ,
217- frame_index : u32 ,
218- memory_map : & [ Lib ] ,
219- symbols_by_module_index : & HashMap < u32 , & AddressResults > ,
220- ) -> StackFrame {
221- let symbol = symbols_by_module_index
222- . get ( & frame. module_index )
223- . and_then ( |symbol_map| {
224- // If we have a symbol table for this library, then we know that
225- // this address is present in it.
226- symbol_map
227- . get ( & frame. address )
228- . unwrap ( )
229- . as_ref ( )
230- . map ( |address_result| Symbol {
231- function : address_result. symbol_name . clone ( ) ,
232- function_offset : frame. address - address_result. symbol_address ,
233- function_size : address_result. function_size ,
234- debug_info : address_result. inline_frames . as_ref ( ) . map ( |frames| {
235- let ( outer, inlines) = frames
236- . split_last ( )
237- . expect ( "inline_frames should always have at least one element" ) ;
238- DebugInfo {
239- file : outer. file_path . as_ref ( ) . map ( to_api_file_path) ,
240- line : outer. line_number . and_then ( NonZeroU32 :: new) ,
241- inlines : inlines
242- . iter ( )
243- . map ( |inline_frame| FrameDebugInfo {
244- function : inline_frame. function . clone ( ) ,
245- file : inline_frame. file_path . as_ref ( ) . map ( to_api_file_path) ,
246- line : inline_frame. line_number . and_then ( NonZeroU32 :: new) ,
247- } )
248- . collect ( ) ,
249- }
250- } ) ,
251- } )
252- } ) ;
253- StackFrame {
254- frame : frame_index,
255- module_offset : frame. address ,
256- module : memory_map[ frame. module_index as usize ] . debug_name . clone ( ) ,
257- symbol,
258- }
259- }
260-
261- Response {
262- results : request
263- . jobs ( )
264- . map ( |job| result_for_job ( job, & symbolicated_addresses) )
265- . collect ( ) ,
266- }
163+ Response ( Results {
164+ request,
165+ symbolicated_addresses,
166+ } )
267167}
0 commit comments