blob: b27fd14315b0a4851187550eae95282c19d68a30 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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
|