lldbutil.py revision b51d87d4b31ca2bf024633d03aeeba8e095745e3
11605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen""" 2b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny ChenThis LLDB module contains miscellaneous utilities. 31605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen""" 41605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 51605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chenimport lldb 630425e9677342cff9995cd4937fdc12354b6b24bJohnny Chenimport sys 730425e9677342cff9995cd4937fdc12354b6b24bJohnny Chenimport StringIO 81605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 91605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chendef GetFunctionNames(thread): 101605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 111605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen Returns a sequence of function names from the stack frames of this thread. 121605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 131605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen def GetFuncName(i): 141605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return thread.GetFrameAtIndex(i).GetFunction().GetName() 151605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 161605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return map(GetFuncName, range(thread.GetNumFrames())) 171605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 181605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 19b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chendef GetSymbolNames(thread): 20b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen """ 21b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen Returns a sequence of symbols for this thread. 22b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen """ 23b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen def GetSymbol(i): 24b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen return thread.GetFrameAtIndex(i).GetSymbol().GetName() 25b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 26b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen return map(GetSymbol, range(thread.GetNumFrames())) 27b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 28b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 29b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chendef GetPCAddresses(thread): 30b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen """ 31b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen Returns a sequence of pc addresses for this thread. 32b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen """ 33b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen def GetPCAddress(i): 34b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen return thread.GetFrameAtIndex(i).GetPCAddress() 35b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 36b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen return map(GetPCAddress, range(thread.GetNumFrames())) 37b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 38b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 391605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chendef GetFilenames(thread): 401605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 411605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen Returns a sequence of file names from the stack frames of this thread. 421605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 431605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen def GetFilename(i): 441605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return thread.GetFrameAtIndex(i).GetLineEntry().GetFileSpec().GetFilename() 451605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 461605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return map(GetFilename, range(thread.GetNumFrames())) 471605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 481605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 491605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chendef GetLineNumbers(thread): 501605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 511605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen Returns a sequence of line numbers from the stack frames of this thread. 521605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 531605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen def GetLineNumber(i): 541605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return thread.GetFrameAtIndex(i).GetLineEntry().GetLine() 551605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 561605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return map(GetLineNumber, range(thread.GetNumFrames())) 571605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 581605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 591605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chendef GetModuleNames(thread): 601605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 611605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen Returns a sequence of module names from the stack frames of this thread. 621605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """ 631605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen def GetModuleName(i): 641605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return thread.GetFrameAtIndex(i).GetModule().GetFileSpec().GetFilename() 651605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 661605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen return map(GetModuleName, range(thread.GetNumFrames())) 671605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 681605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 6988866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chendef GetStackFrames(thread): 7088866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen """ 7188866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen Returns a sequence of stack frames for this thread. 7288866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen """ 7388866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen def GetStackFrame(i): 7488866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen return thread.GetFrameAtIndex(i) 7588866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen 7688866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen return map(GetStackFrame, range(thread.GetNumFrames())) 7788866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen 7888866ac481cd5533c18e00233aeced2eb1fce42bJohnny Chen 7930425e9677342cff9995cd4937fdc12354b6b24bJohnny Chendef PrintStackTrace(thread, string_buffer = False): 801605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen """Prints a simple stack trace of this thread.""" 8130425e9677342cff9995cd4937fdc12354b6b24bJohnny Chen 82b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen output = StringIO.StringIO() if string_buffer else sys.stdout 83b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen target = thread.GetProcess().GetTarget() 84b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 851605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen depth = thread.GetNumFrames() 861605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 871605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen mods = GetModuleNames(thread) 881605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen funcs = GetFunctionNames(thread) 89b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen symbols = GetSymbolNames(thread) 901605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen files = GetFilenames(thread) 911605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen lines = GetLineNumbers(thread) 92b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen addrs = GetPCAddresses(thread) 9330425e9677342cff9995cd4937fdc12354b6b24bJohnny Chen 9430425e9677342cff9995cd4937fdc12354b6b24bJohnny Chen print >> output, "Stack trace for thread id={0:#x} name={1} queue={2}:".format( 951605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen thread.GetThreadID(), thread.GetName(), thread.GetQueueName()) 961605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 97b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen for i in range(depth): 98b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen frame = thread.GetFrameAtIndex(i) 99b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen function = frame.GetFunction() 100b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 101b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen load_addr = addrs[i].GetLoadAddress(target) 102b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen if not function.IsValid(): 103b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen file_addr = addrs[i].GetFileAddress() 104b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen print >> output, " frame #{num}: {addr:#016x} {mod}`{symbol} + ????".format( 105b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen num=i, addr=load_addr, mod=mods[i], symbol=symbols[i]) 106b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen else: 107b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen print >> output, " frame #{num}: {addr:#016x} {mod}`{func} at {file}:{line}".format( 108b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen num=i, addr=load_addr, mod=mods[i], func=funcs[i], file=files[i], line=lines[i]) 109b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 110b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen if string_buffer: 111b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen return output.getvalue() 112b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 113b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 114b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chendef PrintStackTraces(process, string_buffer = False): 115b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen """Prints the stack traces of all the threads.""" 116b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 117b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen output = StringIO.StringIO() if string_buffer else sys.stdout 118b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen 119b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen print >> output, "Stack traces for " + repr(process) 1201605cf6d06d95bfe381693ced84a216899ecac6fJohnny Chen 121b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen for i in range(process.GetNumThreads()): 122b51d87d4b31ca2bf024633d03aeeba8e095745e3Johnny Chen print >> output, PrintStackTrace(process.GetThreadAtIndex(i), string_buffer=True) 12330425e9677342cff9995cd4937fdc12354b6b24bJohnny Chen 12430425e9677342cff9995cd4937fdc12354b6b24bJohnny Chen if string_buffer: 12530425e9677342cff9995cd4937fdc12354b6b24bJohnny Chen return output.getvalue() 126