| import sys |
| import lldb |
| import lldbutil |
| |
| def stop_if_called_from_a(): |
| # lldb.debugger_unique_id stores the id of the debugger associated with us. |
| dbg = lldb.SBDebugger.FindDebuggerWithID(lldb.debugger_unique_id) |
| |
| # Perform synchronous interaction with the debugger. |
| old_async = dbg.GetAsync() |
| dbg.SetAsync(True) |
| |
| # Retrieve the target, process, and the only thread. |
| target = dbg.GetSelectedTarget() |
| process = target.GetProcess() |
| thread = process.GetThreadAtIndex(0) |
| |
| # We check the call frames in order to stop only when the immediate caller |
| # of the leaf function c() is a(). If it's not the right caller, we ask the |
| # command interpreter to continue execution. |
| |
| print >> sys.stdout, "Checking call frames..." |
| lldbutil.print_stacktrace(thread) |
| should_stop = True |
| if thread.GetNumFrames() >= 2: |
| funcs = lldbutil.get_function_names(thread) |
| print >> sys.stdout, funcs[0], "called from", funcs[1] |
| if (funcs[0] == 'c' and funcs[1] == 'a'): |
| should_stop = True |
| else: |
| process.Continue() |
| should_stop = False |
| |
| dbg.SetAsync(old_async) |
| return should_stop |
| |
| |