| #!/usr/bin/python |
| |
| import lldb |
| import struct |
| |
| |
| class OperatingSystemPlugIn(object): |
| """Class that provides a OS plugin that along with the particular code in main.cpp |
| emulates the following scenario: |
| a) We stop in an OS Plugin created thread - which should be thread index 1 |
| b) We step-out from that thread |
| c) We hit a breakpoint in another thread, and DON'T produce the OS Plugin thread. |
| d) We continue, and when we hit the step out breakpoint, we again produce the same |
| OS Plugin thread. |
| main.cpp sets values into the global variable g_value, which we use to tell the OS |
| plugin whether to produce the OS plugin thread or not. |
| Since we are always producing an OS plugin thread with a backing thread, we don't |
| need to implement get_register_info or get_register_data. |
| """ |
| |
| def __init__(self, process): |
| '''Initialization needs a valid.SBProcess object. |
| |
| This plug-in will get created after a live process is valid and has stopped for the |
| first time.''' |
| print("Plugin initialized.") |
| self.process = None |
| self.start_stop_id = 0 |
| self.g_value = lldb.SBValue() |
| |
| if isinstance(process, lldb.SBProcess) and process.IsValid(): |
| self.process = process |
| self.g_value = process.GetTarget().FindFirstGlobalVariable("g_value") |
| if not self.g_value.IsValid(): |
| print("Could not find g_value") |
| |
| def create_thread(self, tid, context): |
| print("Called create thread with tid: ", tid) |
| return None |
| |
| def get_thread_info(self): |
| g_value = self.g_value.GetValueAsUnsigned() |
| print("Called get_thread_info: g_value: %d"%(g_value)) |
| if g_value == 0 or g_value == 2: |
| return [{'tid': 0x111111111, |
| 'name': 'one', |
| 'queue': 'queue1', |
| 'state': 'stopped', |
| 'stop_reason': 'breakpoint', |
| 'core' : 1 }] |
| else: |
| return [] |
| |
| def get_register_info(self): |
| print ("called get_register_info") |
| return None |
| |
| |
| def get_register_data(self, tid): |
| print("Get register data called for tid: %d"%(tid)) |
| return None |
| |