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. dbg.SetAsync(False) # 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) 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'): #print >> sys.stdout, "Stopped at c() with immediate caller as a()." pass else: #print >> sys.stdout, "Continuing..." process.Continue() return True