diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py --- a/lldb/examples/python/crashlog.py +++ b/lldb/examples/python/crashlog.py @@ -76,10 +76,12 @@ def __init__(self, index, app_specific_backtrace): self.index = index + self.id = index self.frames = list() self.idents = list() self.registers = dict() self.reason = None + self.name = None self.queue = None self.crashed = False self.app_specific_backtrace = app_specific_backtrace @@ -521,14 +523,18 @@ for json_thread in json_threads: thread = self.crashlog.Thread(idx, False) if 'name' in json_thread: + thread.name = json_thread['name'] thread.reason = json_thread['name'] + if 'id' in json_thread: + thread.id = int(json_thread['id']) if json_thread.get('triggered', False): self.crashlog.crashed_thread_idx = idx thread.crashed = True if 'threadState' in json_thread: thread.registers = self.parse_thread_registers( json_thread['threadState']) - thread.queue = json_thread.get('queue') + if 'queue' in json_thread: + thread.queue = json_thread.get('queue') self.parse_frames(thread, json_thread.get('frames', [])) self.crashlog.threads.append(thread) idx += 1 diff --git a/lldb/examples/python/scripted_process/crashlog_scripted_process.py b/lldb/examples/python/scripted_process/crashlog_scripted_process.py --- a/lldb/examples/python/scripted_process/crashlog_scripted_process.py +++ b/lldb/examples/python/scripted_process/crashlog_scripted_process.py @@ -135,15 +135,12 @@ self.backing_thread = crashlog_thread self.idx = self.backing_thread.index + self.tid = self.backing_thread.id + self.name = self.backing_thread.name + self.queue = self.backing_thread.queue self.has_crashed = (self.scripted_process.crashed_thread_idx == self.idx) self.create_stackframes() - def get_thread_id(self) -> int: - return self.idx - - def get_name(self) -> str: - return CrashLogScriptedThread.__name__ + ".thread-" + str(self.idx) - def get_state(self): if not self.has_crashed: return lldb.eStateStopped diff --git a/lldb/examples/python/scripted_process/scripted_process.py b/lldb/examples/python/scripted_process/scripted_process.py --- a/lldb/examples/python/scripted_process/scripted_process.py +++ b/lldb/examples/python/scripted_process/scripted_process.py @@ -219,8 +219,8 @@ self.scripted_process = None self.process = None self.args = None - - self.id = None + self.idx = 0 + self.tid = 0 self.idx = None self.name = None self.queue = None @@ -236,24 +236,29 @@ self.process = self.target.GetProcess() self.get_register_info() + def get_thread_idx(self): + """ Get the scripted thread index. + + Returns: + int: The index of the scripted thread in the scripted process. + """ + return self.idx - @abstractmethod def get_thread_id(self): """ Get the scripted thread identifier. Returns: int: The identifier of the scripted thread. """ - pass + return self.tid - @abstractmethod def get_name(self): """ Get the scripted thread name. Returns: str: The name of the scripted thread. """ - pass + return self.name def get_state(self): """ Get the scripted thread state type. @@ -277,7 +282,7 @@ Returns: str: The queue name associated with the scripted thread. """ - pass + return self.queue @abstractmethod def get_stop_reason(self): diff --git a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test --- a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test +++ b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test @@ -4,17 +4,17 @@ # RUN: cp %S/Inputs/scripted_crashlog.ips %t.crash # RUN: %python %S/patch-crashlog.py --binary %t.out --crashlog %t.crash --offsets '{"main":160, "bar":20, "foo":24}' --json -# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog -a -i %t.crash' 2>&1 -o "bt all" | FileCheck %s +# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog -a -i %t.crash' 2>&1 -o "thread list" -o "bt all" | FileCheck %s # CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands # CHECK: (lldb) process status # CHECK-NEXT: Process 24991 stopped -# CHECK-NEXT: * thread #3, name = 'CrashLogScriptedThread.thread-2', stop reason = EXC_BAD_ACCESS +# CHECK-NEXT: * thread #3, stop reason = EXC_BAD_ACCESS # CHECK-NEXT: frame #0: 0x00000001047f5970 scripted_crashlog_json.test.tmp.out`bar # CHECK: (lldb) thread backtrace -# CHECK-NEXT: * thread #3, name = 'CrashLogScriptedThread.thread-2', stop reason = EXC_BAD_ACCESS +# CHECK-NEXT: * thread #3, stop reason = EXC_BAD_ACCESS # CHECK-NEXT: * frame #0: 0x00000001047f5970 scripted_crashlog_json.test.tmp.out`bar # CHECK-NEXT: frame #1: 0x00000001047f5998 scripted_crashlog_json.test.tmp.out`foo # CHECK-NEXT: frame #2: 0x00000001047f5b04 scripted_crashlog_json.test.tmp.out`compute_pow @@ -24,14 +24,21 @@ # CHECK-NEXT: frame #6: 0x000000018bf5326c libsystem_pthread.dylib`_pthread_start # CHECK-NEXT: frame #7: 0x000000018bf4e08c libsystem_pthread.dylib`thread_start +# CHECK: (lldb) thread list +# CHECK-NEXT: Process 24991 stopped +# CHECK-NEXT: thread #1: tid = 0x4ea840, 0x000000018bf17854 libsystem_kernel.dylib`__ulock_wait{{.*}}, queue = 'com.apple.main-thread' +# CHECK-NEXT: thread #2: tid = 0x4ea850, 0x00000001047f59e8 scripted_crashlog_json.test.tmp.out`call_and_wait +# CHECK-NEXT: * thread #3: tid = 0x4ea851, 0x00000001047f5970 scripted_crashlog_json.test.tmp.out`bar{{.*}}, stop reason = EXC_BAD_ACCESS + + # CHECK: (lldb) bt all -# CHECK-NEXT: thread #1, name = 'CrashLogScriptedThread.thread-0' +# CHECK-NEXT: thread #1 # CHECK-NEXT: frame #0: 0x000000018bf17854 libsystem_kernel.dylib`__ulock_wait # CHECK-NEXT: frame #1: 0x000000018bf555a0 libsystem_pthread.dylib`_pthread_join # CHECK-NEXT: frame #2: 0x000000018beae9c0 libc++.1.dylib`std::__1::thread::join # CHECK-NEXT: frame #3: 0x00000001047f5bb8 scripted_crashlog_json.test.tmp.out`main # CHECK-NEXT: frame #4: 0x0000000104ae5088 dyld`start -# CHECK-NEXT: thread #2, name = 'CrashLogScriptedThread.thread-1' +# CHECK-NEXT: thread #2 # CHECK-NEXT: frame #0: 0x00000001047f59e8 scripted_crashlog_json.test.tmp.out`call_and_wait # CHECK-NEXT: frame #1: 0x00000001047f59d4 scripted_crashlog_json.test.tmp.out`call_and_wait # CHECK-NEXT: frame #2: 0x00000001047f7690 scripted_crashlog_json.test.tmp.out`decltype @@ -39,7 +46,7 @@ # CHECK-NEXT: frame #4: 0x00000001047f6d58 scripted_crashlog_json.test.tmp.out`void* std::__1::__thread_proxy # CHECK-NEXT: frame #5: 0x000000018bf5326c libsystem_pthread.dylib`_pthread_start # CHECK-NEXT: frame #6: 0x000000018bf4e08c libsystem_pthread.dylib`thread_start -# CHECK-NEXT: * thread #3, name = 'CrashLogScriptedThread.thread-2', stop reason = EXC_BAD_ACCESS +# CHECK-NEXT: * thread #3, stop reason = EXC_BAD_ACCESS # CHECK-NEXT: * frame #0: 0x00000001047f5970 scripted_crashlog_json.test.tmp.out`bar # CHECK-NEXT: frame #1: 0x00000001047f5998 scripted_crashlog_json.test.tmp.out`foo # CHECK-NEXT: frame #2: 0x00000001047f5b04 scripted_crashlog_json.test.tmp.out`compute_pow