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