mib created this revision. mib added a reviewer: JDevlieghere. mib added a project: LLDB. Herald added a project: All. mib requested review of this revision. Herald added a subscriber: lldb-commits.
This patch introduces a new flag for the interactive crashlog mode, that allow the user to specify, which target to use to create the scripted process. This can be very useful when lldb already have few targets created: Instead of taking the first one (zeroth index), we will use that flag to create a new target. If that fails, we rely on the symbolicator to create a targer. If that also fails and there are already some targets loaded in lldb, we use the first one. rdar://94682869 Signed-off-by: Med Ismail Bennani <medismail.benn...@gmail.com> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D129611 Files: lldb/examples/python/crashlog.py lldb/examples/python/scripted_process/crashlog_scripted_process.py lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test Index: lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test =================================================================== --- lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test +++ lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test @@ -2,7 +2,7 @@ # RUN: mkdir -p %t.dir # RUN: yaml2obj %S/Inputs/interactive_crashlog/multithread-test.yaml > %t.dir/multithread-test -# RUN: %lldb %t.dir/multithread-test -o 'command script import lldb.macosx.crashlog' -o 'crashlog -a -i %S/Inputs/interactive_crashlog/multithread-test.ips' -o "thread list" -o "bt all" 2>&1 | FileCheck %s +# RUN: %lldb -o 'command script import lldb.macosx.crashlog' -o 'crashlog -a -i -t %t.dir/multithread-test %S/Inputs/interactive_crashlog/multithread-test.ips' -o "thread list" -o "bt all" 2>&1 | FileCheck %s # CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands Index: lldb/examples/python/scripted_process/crashlog_scripted_process.py =================================================================== --- lldb/examples/python/scripted_process/crashlog_scripted_process.py +++ lldb/examples/python/scripted_process/crashlog_scripted_process.py @@ -43,7 +43,8 @@ def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): super().__init__(target, args) - if not self.target or not self.target.IsValid(): + if not self.target.GetExecutable() or not self.target.IsValid(): + # Return error return self.crashlog_path = None @@ -54,6 +55,7 @@ self.crashlog_path = crashlog_path.GetStringValue(4096) if not self.crashlog_path: + # Return error return load_all_images = args.GetValueForKey("load_all_images") Index: lldb/examples/python/crashlog.py =================================================================== --- lldb/examples/python/crashlog.py +++ lldb/examples/python/crashlog.py @@ -1017,11 +1017,18 @@ crashlog = CrashLogParser().parse(debugger, crashlog_path, False) - if debugger.GetNumTargets() > 0: - target = debugger.GetTargetAtIndex(0) - else: + target = lldb.SBTarget() + # 1. Try to use the user-provided target + if options.target_path is not None and options.target_path != "": + target = debugger.CreateTarget(options.target_path) + # 2. If that didn't work, try to create a target using the symbolicator + if target is None or not target.IsValid(): target = crashlog.create_target() - if not target: + # 3. If that didn't work, and a target is already loaded, use it + if (target is None or not target.IsValid()) and debugger.GetNumTargets() > 0: + target = debugger.GetTargetAtIndex(0) + # 4. Fail + if target is None or not target.IsValid(): result.PutCString("error: couldn't create target") return @@ -1183,6 +1190,11 @@ action='store_true', help='dump symbolicated stackframes without creating a debug session', default=True) + option_parser.add_option( + '--target', + '-t', + dest='target_path', + help='the target binary path that should be used for interactive crashlog') return option_parser
Index: lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test =================================================================== --- lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test +++ lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test @@ -2,7 +2,7 @@ # RUN: mkdir -p %t.dir # RUN: yaml2obj %S/Inputs/interactive_crashlog/multithread-test.yaml > %t.dir/multithread-test -# RUN: %lldb %t.dir/multithread-test -o 'command script import lldb.macosx.crashlog' -o 'crashlog -a -i %S/Inputs/interactive_crashlog/multithread-test.ips' -o "thread list" -o "bt all" 2>&1 | FileCheck %s +# RUN: %lldb -o 'command script import lldb.macosx.crashlog' -o 'crashlog -a -i -t %t.dir/multithread-test %S/Inputs/interactive_crashlog/multithread-test.ips' -o "thread list" -o "bt all" 2>&1 | FileCheck %s # CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands Index: lldb/examples/python/scripted_process/crashlog_scripted_process.py =================================================================== --- lldb/examples/python/scripted_process/crashlog_scripted_process.py +++ lldb/examples/python/scripted_process/crashlog_scripted_process.py @@ -43,7 +43,8 @@ def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): super().__init__(target, args) - if not self.target or not self.target.IsValid(): + if not self.target.GetExecutable() or not self.target.IsValid(): + # Return error return self.crashlog_path = None @@ -54,6 +55,7 @@ self.crashlog_path = crashlog_path.GetStringValue(4096) if not self.crashlog_path: + # Return error return load_all_images = args.GetValueForKey("load_all_images") Index: lldb/examples/python/crashlog.py =================================================================== --- lldb/examples/python/crashlog.py +++ lldb/examples/python/crashlog.py @@ -1017,11 +1017,18 @@ crashlog = CrashLogParser().parse(debugger, crashlog_path, False) - if debugger.GetNumTargets() > 0: - target = debugger.GetTargetAtIndex(0) - else: + target = lldb.SBTarget() + # 1. Try to use the user-provided target + if options.target_path is not None and options.target_path != "": + target = debugger.CreateTarget(options.target_path) + # 2. If that didn't work, try to create a target using the symbolicator + if target is None or not target.IsValid(): target = crashlog.create_target() - if not target: + # 3. If that didn't work, and a target is already loaded, use it + if (target is None or not target.IsValid()) and debugger.GetNumTargets() > 0: + target = debugger.GetTargetAtIndex(0) + # 4. Fail + if target is None or not target.IsValid(): result.PutCString("error: couldn't create target") return @@ -1183,6 +1190,11 @@ action='store_true', help='dump symbolicated stackframes without creating a debug session', default=True) + option_parser.add_option( + '--target', + '-t', + dest='target_path', + help='the target binary path that should be used for interactive crashlog') return option_parser
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits