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
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
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
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.
Returns:
str: The queue name associated with the scripted thread.
"""
- pass
+ return self.queue
@abstractmethod
def get_stop_reason(self):
# 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
# 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
# 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