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

