def test_trim_function_name(): assert trim_function_name('+[foo:(bar)]', 'objc') == '+[foo:(bar)]' assert trim_function_name('[foo:(bar)]', 'objc') == '[foo:(bar)]' assert trim_function_name('-[foo:(bar)]', 'objc') == '-[foo:(bar)]' assert trim_function_name('(anonymous namespace)::foo(int)', 'native') == '(anonymous namespace)::foo' assert trim_function_name('foo::bar::foo(int)', 'native') == 'foo::bar::foo'
def get_crash_location(exception, platform=None): default = None for frame in reversed( get_path(exception, 'stacktrace', 'frames', filter=True) or ()): fn = frame.get('filename') or frame.get('abs_path') if fn: func = frame.get('function') if func is not None: from sentry.interfaces.stacktrace import trim_function_name func = trim_function_name(func, frame.get('platform') or platform) if frame.get('in_app'): return fn, func if default is None: default = fn, func return default