def _analyze_frames(self, hang_type, java_stack_trace, make_modules_lower_case, dump_analysis_line_iterator, submitted_timestamp, crashed_thread, processor_notes): """ After the header information, the dump file consists of just frame information. This function cycles through the frame information looking for frames associated with the crashed thread (determined in analyzeHeader). Each frame from that thread is written to the database until it has found a maximum of ten frames. returns: a dictionary will various values to be used to update report in the database, including: truncated - boolean: True - due to excessive length the frames of the crashing thread may have been truncated. signature - string: an overall signature calculated for this crash processor_notes - string: any errors or warnings that happened during the processing input parameters: hang_type - 0: if this is not a hang -1: if "HangID" present in json, but "Hang" was not present "Hang" value: if "Hang" present - probably 1 java_stack_trace - a source for java lang signature information make_modules_lower_case - boolean, should modules be forced to lower case for signature generation? dump_analysis_line_iterator - an iterator that cycles through lines from the crash dump submitted_timestamp crashed_thread - the number of the thread that crashed - we want frames only from the crashed thread processor_notes """ #logger.info("analyzeFrames") frame_counter = 0 is_truncated = False frame_lines_were_found = False signature_generation_frames = [] topmost_sourcefiles = [] if hang_type == 1: thread_for_signature = 0 else: thread_for_signature = crashed_thread max_topmost_sourcefiles = 1 # Bug 519703 calls for just one. # Lets build in some flex for line in dump_analysis_line_iterator: frame_lines_were_found = True #logger.debug(" %s", line) line = line.strip() if line == '': processor_notes.append("An unexpected blank line in " "this dump was ignored") continue # ignore unexpected blank lines (thread_num, frame_num, module_name, function, source, source_line, instruction) = [emptyFilter(x) for x in line.split("|")] if len(topmost_sourcefiles) < max_topmost_sourcefiles and source: topmost_sourcefiles.append(source) if thread_for_signature == int(thread_num): if frame_counter < 30: if make_modules_lower_case: try: module_name = module_name.lower() except AttributeError: pass this_frame_signature = \ self.c_signature_tool.normalize_signature( module_name, function, source, source_line, instruction ) signature_generation_frames.append(this_frame_signature) if ( frame_counter == self.config.crashing_thread_frame_threshold ): processor_notes.append( "This dump is too long and has triggered the automatic" " truncation routine" ) dump_analysis_line_iterator.useSecondaryCache() is_truncated = True frame_counter += 1 elif frame_counter: break dump_analysis_line_iterator.stopUsingSecondaryCache() signature = self._generate_signature(signature_generation_frames, java_stack_trace, hang_type, crashed_thread, processor_notes) if not frame_lines_were_found: message = "No frame data available" processor_notes.append(message) self.config.logger.info("%s", message) return DotDict({ "signature": signature, "truncated": is_truncated, "topmost_filenames": topmost_sourcefiles, })
def _analyze_frames(self, hang_type, java_stack_trace, make_modules_lower_case, dump_analysis_line_iterator, submitted_timestamp, crashed_thread, processor_notes): """ After the header information, the dump file consists of just frame information. This function cycles through the frame information looking for frames associated with the crashed thread (determined in analyzeHeader). Each frame from that thread is written to the database until it has found a maximum of ten frames. returns: a dictionary will various values to be used to update report in the database, including: truncated - boolean: True - due to excessive length the frames of the crashing thread may have been truncated. signature - string: an overall signature calculated for this crash processor_notes - string: any errors or warnings that happened during the processing input parameters: hang_type - 0: if this is not a hang -1: if "HangID" present in json, but "Hang" was not present "Hang" value: if "Hang" present - probably 1 java_stack_trace - a source for java lang signature information make_modules_lower_case - boolean, should modules be forced to lower case for signature generation? dump_analysis_line_iterator - an iterator that cycles through lines from the crash dump submitted_timestamp crashed_thread - the number of the thread that crashed - we want frames only from the crashed thread processor_notes """ #logger.info("analyzeFrames") frame_counter = 0 is_truncated = False frame_lines_were_found = False signature_generation_frames = [] topmost_sourcefiles = [] if hang_type == 1: thread_for_signature = 0 else: thread_for_signature = crashed_thread max_topmost_sourcefiles = 1 # Bug 519703 calls for just one. # Lets build in some flex for line in dump_analysis_line_iterator: frame_lines_were_found = True #logger.debug(" %s", line) line = line.strip() if line == '': processor_notes.append("An unexpected blank line in " "this dump was ignored") continue # ignore unexpected blank lines (thread_num, frame_num, module_name, function, source, source_line, instruction) = [emptyFilter(x) for x in line.split("|")] if len(topmost_sourcefiles) < max_topmost_sourcefiles and source: topmost_sourcefiles.append(source) if thread_for_signature == int(thread_num): if frame_counter < 30: if make_modules_lower_case: try: module_name = module_name.lower() except AttributeError: pass this_frame_signature = \ self.c_signature_tool.normalize_signature( module_name, function, source, source_line, instruction ) signature_generation_frames.append(this_frame_signature) if (frame_counter == self.config.crashing_thread_frame_threshold): processor_notes.append( "This dump is too long and has triggered the automatic" " truncation routine") dump_analysis_line_iterator.useSecondaryCache() is_truncated = True frame_counter += 1 elif frame_counter: break dump_analysis_line_iterator.stopUsingSecondaryCache() signature = self._generate_signature(signature_generation_frames, java_stack_trace, hang_type, crashed_thread, processor_notes) if not frame_lines_were_found: message = "No frame data available" processor_notes.append(message) self.config.logger.info("%s", message) return DotDict({ "signature": signature, "truncated": is_truncated, "topmost_filenames": topmost_sourcefiles, })