forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
| 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.PrintStackTrace(thread)
 | |
|     if thread.GetNumFrames() >= 2:
 | |
|         funcs = lldbutil.GetFunctionNames(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
 | |
| 
 |