def _handle_response_status(event_data, response_json): if not response_json: error = SymbolicationFailed(type=EventError.NATIVE_INTERNAL_FAILURE) elif response_json['status'] == 'completed': return True elif response_json['status'] == 'failed': error = SymbolicationFailed(message=response_json.get('message') or None, type=EventError.NATIVE_SYMBOLICATOR_FAILED) else: logger.error('Unexpected symbolicator status: %s', response_json['status']) error = SymbolicationFailed(type=EventError.NATIVE_INTERNAL_FAILURE) write_error(error, event_data)
def _merge_minidump_response(data, response): data["platform"] = "native" if response.get("crashed") is not None: data["level"] = "fatal" if response["crashed"] else "info" validate_and_set_timestamp(data, response.get("timestamp")) if response.get("system_info"): _merge_system_info(data, response["system_info"]) sdk_info = get_sdk_from_event(data) images = [] set_path(data, "debug_meta", "images", value=images) for complete_image in response["modules"]: image = {} _merge_image(image, complete_image, sdk_info, lambda e: write_error(e, data)) images.append(image) # Extract the crash reason and infos data_exception = get_path(data, "exception", "values", 0) exc_value = ("Assertion Error: %s" % response.get("assertion") if response.get("assertion") else "Fatal Error: %s" % response.get("crash_reason")) data_exception["value"] = exc_value data_exception["type"] = response.get("crash_reason") data_threads = [] if response["stacktraces"]: data["threads"] = {"values": data_threads} else: error = SymbolicationFailed(message="minidump has no thread list", type=EventError.NATIVE_SYMBOLICATOR_FAILED) write_error(error, data) for complete_stacktrace in response["stacktraces"]: is_requesting = complete_stacktrace.get("is_requesting") thread_id = complete_stacktrace.get("thread_id") data_thread = {"id": thread_id, "crashed": is_requesting} data_threads.append(data_thread) if is_requesting: data_exception["thread_id"] = thread_id data_stacktrace = data_exception.setdefault("stacktrace", {}) data_stacktrace["frames"] = [] else: data_thread["stacktrace"] = data_stacktrace = {"frames": []} if complete_stacktrace.get("registers"): data_stacktrace["registers"] = complete_stacktrace["registers"] for complete_frame in reversed(complete_stacktrace["frames"]): new_frame = {} _merge_frame(new_frame, complete_frame) data_stacktrace["frames"].append(new_frame)
def _handle_image_status(status, image, sdk_info, data): if status in ("found", "unused"): return elif status == "missing": package = image.get("code_file") # TODO(mitsuhiko): This check seems wrong? This call seems to # mirror the one in the ios symbol server support. If we change # one we need to change the other. if not package or is_known_third_party(package, sdk_info=sdk_info): return if is_optional_package(package, sdk_info=sdk_info): error = SymbolicationFailed( type=EventError.NATIVE_MISSING_OPTIONALLY_BUNDLED_DSYM) else: error = SymbolicationFailed(type=EventError.NATIVE_MISSING_DSYM) elif status == "malformed": error = SymbolicationFailed(type=EventError.NATIVE_BAD_DSYM) elif status == "too_large": error = SymbolicationFailed(type=EventError.FETCH_TOO_LARGE) elif status == "fetching_failed": error = SymbolicationFailed(type=EventError.FETCH_GENERIC_ERROR) elif status == "other": error = SymbolicationFailed(type=EventError.UNKNOWN_ERROR) else: logger.error("Unknown status: %s", status) return error.image_arch = image.get("arch") error.image_path = image.get("code_file") error.image_name = image_name(image.get("code_file")) error.image_uuid = image.get("debug_id") write_error(error, data)
def _merge_full_response(data, response): data["platform"] = "native" if response.get("crashed") is not None: data["level"] = "fatal" if response["crashed"] else "info" if response.get("system_info"): _merge_system_info(data, response["system_info"]) sdk_info = get_sdk_from_event(data) images = [] set_path(data, "debug_meta", "images", value=images) for complete_image in response["modules"]: image = {} _merge_image(image, complete_image, sdk_info, data) images.append(image) # Extract the crash reason and infos data_exception = get_path(data, "exception", "values", 0) if response.get("assertion"): data_exception["value"] = "Assertion Error: {}".format( response["assertion"]) elif response.get("crash_details"): data_exception["value"] = response["crash_details"] elif response.get("crash_reason"): data_exception["value"] = "Fatal Error: {}".format( response["crash_reason"]) else: # We're merging a full response, so there was no initial payload # submitted. Assuming that this still contains the placeholder, remove # it rather than showing a default value. data_exception.pop("value", None) if response.get("crash_reason"): data_exception["type"] = response["crash_reason"] data_threads = [] if response["stacktraces"]: data["threads"] = {"values": data_threads} else: error = SymbolicationFailed(message="minidump has no thread list", type=EventError.NATIVE_SYMBOLICATOR_FAILED) write_error(error, data) for complete_stacktrace in response["stacktraces"]: is_requesting = complete_stacktrace.get("is_requesting") thread_id = complete_stacktrace.get("thread_id") data_thread = {"id": thread_id, "crashed": is_requesting} data_threads.append(data_thread) if is_requesting: data_exception["thread_id"] = thread_id data_stacktrace = data_exception.setdefault("stacktrace", {}) data_stacktrace["frames"] = [] else: data_thread["stacktrace"] = data_stacktrace = {"frames": []} if complete_stacktrace.get("registers"): data_stacktrace["registers"] = complete_stacktrace["registers"] for complete_frame in reversed(complete_stacktrace["frames"]): new_frame = {} _merge_frame(new_frame, complete_frame) data_stacktrace["frames"].append(new_frame)
def handle_symbolicator_status(status, image, sdk_info, handle_symbolication_failed): if status in ('found', 'unused'): return elif status in ( 'missing_debug_file', # TODO(markus): Legacy key. Remove after next deploy 'missing'): package = image.get('code_file') # TODO(mitsuhiko): This check seems wrong? This call seems to # mirror the one in the ios symbol server support. If we change # one we need to change the other. if not package or is_known_third_party(package, sdk_info=sdk_info): return if is_optional_package(package, sdk_info=sdk_info): error = SymbolicationFailed( type=EventError.NATIVE_MISSING_OPTIONALLY_BUNDLED_DSYM) else: error = SymbolicationFailed(type=EventError.NATIVE_MISSING_DSYM) elif status in ( 'malformed_debug_file', # TODO(markus): Legacy key. Remove after next deploy 'malformed'): error = SymbolicationFailed(type=EventError.NATIVE_BAD_DSYM) elif status == 'too_large': error = SymbolicationFailed(type=EventError.FETCH_TOO_LARGE) elif status == 'fetching_failed': error = SymbolicationFailed(type=EventError.FETCH_GENERIC_ERROR) elif status == 'other': error = SymbolicationFailed(type=EventError.UNKNOWN_ERROR) else: logger.error("Unknown status: %s", status) return error.image_arch = image.get('arch') error.image_path = image.get('code_file') error.image_name = image_name(image.get('code_file')) error.image_uuid = image.get('debug_id') handle_symbolication_failed(error)
def _merge_minidump_response(data, response): data['platform'] = 'native' if response.get('crashed') is not None: data['level'] = 'fatal' if response['crashed'] else 'info' validate_and_set_timestamp(data, response.get('timestamp')) if response.get('system_info'): _merge_system_info(data, response['system_info']) sdk_info = get_sdk_from_event(data) images = [] set_path(data, 'debug_meta', 'images', value=images) for complete_image in response['modules']: image = {} _merge_image(image, complete_image, sdk_info, lambda e: write_error(e, data)) images.append(image) # Extract the crash reason and infos data_exception = get_path(data, 'exception', 'values', 0) exc_value = ('Assertion Error: %s' % response.get('assertion') if response.get('assertion') else 'Fatal Error: %s' % response.get('crash_reason')) data_exception['value'] = exc_value data_exception['type'] = response.get('crash_reason') data_threads = [] if response['stacktraces']: data['threads'] = {'values': data_threads} else: error = SymbolicationFailed(message='minidump has no thread list', type=EventError.NATIVE_SYMBOLICATOR_FAILED) write_error(error, data) for complete_stacktrace in response['stacktraces']: is_requesting = complete_stacktrace.get('is_requesting') thread_id = complete_stacktrace.get('thread_id') data_thread = { 'id': thread_id, 'crashed': is_requesting, } data_threads.append(data_thread) if is_requesting: data_exception['thread_id'] = thread_id data_stacktrace = data_exception.setdefault('stacktrace', {}) data_stacktrace['frames'] = [] else: data_thread['stacktrace'] = data_stacktrace = {'frames': []} if complete_stacktrace.get('registers'): data_stacktrace['registers'] = complete_stacktrace['registers'] for complete_frame in reversed(complete_stacktrace['frames']): new_frame = {} _merge_frame(new_frame, complete_frame) data_stacktrace['frames'].append(new_frame)