Author: Jonas Devlieghere Date: 2021-10-05T12:15:54-07:00 New Revision: 730fca46fc87dad09040cb0b27ede10ae2c7c9d7
URL: https://github.com/llvm/llvm-project/commit/730fca46fc87dad09040cb0b27ede10ae2c7c9d7 DIFF: https://github.com/llvm/llvm-project/commit/730fca46fc87dad09040cb0b27ede10ae2c7c9d7.diff LOG: [lldb] Improve meta data stripping from JSON crashlogs JSON crashlogs normally start with a single line of meta data that we strip unconditionally. Some producers started omitting the meta data which tripped up crashlog. Be more resilient by only removing the first line when we know it really is meta data. rdar://82641662 Added: Modified: lldb/examples/python/crashlog.py lldb/test/Shell/ScriptInterpreter/Python/Crashlog/json.test lldb/test/Shell/ScriptInterpreter/Python/Crashlog/patch-crashlog.py Removed: ################################################################################ diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py index e6d88a033a232..aec4096585222 100755 --- a/lldb/examples/python/crashlog.py +++ b/lldb/examples/python/crashlog.py @@ -415,8 +415,14 @@ def parse(self): with open(self.path, 'r') as f: buffer = f.read() - # First line is meta-data. - buffer = buffer[buffer.index('\n') + 1:] + # Skip the first line if it contains meta data. + head, _, tail = buffer.partition('\n') + try: + metadata = json.loads(head) + if 'app_name' in metadata and 'app_version' in metadata: + buffer = tail + except ValueError: + pass try: self.data = json.loads(buffer) diff --git a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/json.test b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/json.test index a514b07fe9f85..0c522e9d202b7 100644 --- a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/json.test +++ b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/json.test @@ -1,8 +1,13 @@ # RUN: %clang_host -g %S/Inputs/test.c -o %t.out + # RUN: cp %S/Inputs/a.out.ips %t.crash # RUN: python %S/patch-crashlog.py --binary %t.out --crashlog %t.crash --offsets '{"main":20, "bar":9, "foo":16}' --json # RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog %t.crash' 2>&1 | FileCheck %s +# RUN: cp %S/Inputs/a.out.ips %t.nometadata.crash +# RUN: python %S/patch-crashlog.py --binary %t.out --crashlog %t.nometadata.crash --offsets '{"main":20, "bar":9, "foo":16}' --json --no-metadata +# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog %t.nometadata.crash' 2>&1 | FileCheck %s + # CHECK: Thread[0] Crashing Thread Name EXC_BAD_ACCESS (SIGSEGV) (KERN_INVALID_ADDRESS at 0x0000000000000000) # CHECK: [ 0] {{.*}}out`foo + 16 at test.c # CHECK: [ 1] {{.*}}out`bar + 8 at test.c diff --git a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/patch-crashlog.py b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/patch-crashlog.py index 28396c530355e..56558bc153ed7 100644 --- a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/patch-crashlog.py +++ b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/patch-crashlog.py @@ -49,6 +49,9 @@ def patch_addresses(self): self.data = self.data.replace( "@{}@".format(symbol), str(representation(patch_addr))) + def remove_metadata(self): + self.data= self.data[self.data.index('\n') + 1:] + if __name__ == '__main__': parser = argparse.ArgumentParser(description='Crashlog Patcher') @@ -56,6 +59,7 @@ def patch_addresses(self): parser.add_argument('--crashlog', required=True) parser.add_argument('--offsets', required=True) parser.add_argument('--json', default=False, action='store_true') + parser.add_argument('--no-metadata', default=False, action='store_true') args = parser.parse_args() offsets = json.loads(args.offsets) @@ -68,5 +72,8 @@ def patch_addresses(self): p.patch_uuid() p.patch_addresses() + if args.no_metadata: + p.remove_metadata() + with open(args.crashlog, 'w') as file: file.write(p.data) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits