151e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda# This implements the "diagnose-unwind" command, usually installed 251e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda# in the debug session like 3ea6c96105f3830441fbad6404280c12561733a03Enrico Granata# command script import lldb.diagnose 451e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda# it is used when lldb's backtrace fails -- it collects and prints 551e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda# information about the stack frames, and tries an alternate unwind 651e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda# algorithm, that will help to understand why lldb's unwind algorithm 751e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda# did not succeed. 8848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 9848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molendaimport optparse 1083ea875d22d7fc42e80b67ff7d42b5745771999bJason Molendaimport lldb 11848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molendaimport re 12848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molendaimport shlex 13848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 14848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda# Print the frame number, pc, frame pointer, module UUID and function name 150017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda# Returns the SBModule that contains the PC, if it could be found 16848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molendadef backtrace_print_frame (target, frame_num, addr, fp): 17848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda process = target.GetProcess() 18848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda addr_for_printing = addr 193e486f3bca95db8c9263ff6ee61ece2108106a43Jason Molenda addr_width = process.GetAddressByteSize() * 2 20848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if frame_num > 0: 21848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda addr = addr - 1 22848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 23848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda sbaddr = lldb.SBAddress() 2446a60cd013e3d82e56a98964f09312e339361b57Jason Molenda try: 2546a60cd013e3d82e56a98964f09312e339361b57Jason Molenda sbaddr.SetLoadAddress(addr, target) 2646a60cd013e3d82e56a98964f09312e339361b57Jason Molenda module_description = "" 2746a60cd013e3d82e56a98964f09312e339361b57Jason Molenda if sbaddr.GetModule(): 2846a60cd013e3d82e56a98964f09312e339361b57Jason Molenda module_filename = "" 2946a60cd013e3d82e56a98964f09312e339361b57Jason Molenda module_uuid_str = sbaddr.GetModule().GetUUIDString() 3046a60cd013e3d82e56a98964f09312e339361b57Jason Molenda if module_uuid_str == None: 3146a60cd013e3d82e56a98964f09312e339361b57Jason Molenda module_uuid_str = "" 3246a60cd013e3d82e56a98964f09312e339361b57Jason Molenda if sbaddr.GetModule().GetFileSpec(): 3346a60cd013e3d82e56a98964f09312e339361b57Jason Molenda module_filename = sbaddr.GetModule().GetFileSpec().GetFilename() 3446a60cd013e3d82e56a98964f09312e339361b57Jason Molenda if module_filename == None: 3546a60cd013e3d82e56a98964f09312e339361b57Jason Molenda module_filename = "" 3646a60cd013e3d82e56a98964f09312e339361b57Jason Molenda if module_uuid_str != "" or module_filename != "": 3746a60cd013e3d82e56a98964f09312e339361b57Jason Molenda module_description = '%s %s' % (module_filename, module_uuid_str) 3846a60cd013e3d82e56a98964f09312e339361b57Jason Molenda except Exception: 393e486f3bca95db8c9263ff6ee61ece2108106a43Jason Molenda print '%2d: pc==0x%-*x fp==0x%-*x' % (frame_num, addr_width, addr_for_printing, addr_width, fp) 4046a60cd013e3d82e56a98964f09312e339361b57Jason Molenda return 41848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 42848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda sym_ctx = target.ResolveSymbolContextForAddress(sbaddr, lldb.eSymbolContextEverything) 43848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if sym_ctx.IsValid() and sym_ctx.GetSymbol().IsValid(): 44848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda function_start = sym_ctx.GetSymbol().GetStartAddress().GetLoadAddress(target) 45848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda offset = addr - function_start 46848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print '%2d: pc==0x%-*x fp==0x%-*x %s %s + %d' % (frame_num, addr_width, addr_for_printing, addr_width, fp, module_description, sym_ctx.GetSymbol().GetName(), offset) 47848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda else: 48848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print '%2d: pc==0x%-*x fp==0x%-*x %s' % (frame_num, addr_width, addr_for_printing, addr_width, fp, module_description) 490017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda return sbaddr.GetModule() 50848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 510017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda# A simple stack walk algorithm that follows the frame chain. 520017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda# Returns a two-element list; the first element is a list of modules 530017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda# seen and the second element is a list of addresses seen during the backtrace. 54848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molendadef simple_backtrace(debugger): 55848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda target = debugger.GetSelectedTarget() 56848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda process = target.GetProcess() 57848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda cur_thread = process.GetSelectedThread() 58848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 590017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda initial_fp = cur_thread.GetFrameAtIndex(0).GetFP() 60848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 61848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda # If the pseudoreg "fp" isn't recognized, on arm hardcode to r7 which is correct for Darwin programs. 620017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if initial_fp == lldb.LLDB_INVALID_ADDRESS and target.triple[0:3] == "arm": 63848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda for reggroup in cur_thread.GetFrameAtIndex(1).registers: 64848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if reggroup.GetName() == "General Purpose Registers": 65848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda for reg in reggroup: 66848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if reg.GetName() == "r7": 670017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda initial_fp = int (reg.GetValue(), 16) 680017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 690017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda module_list = [] 700017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda address_list = [cur_thread.GetFrameAtIndex(0).GetPC()] 710017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda this_module = backtrace_print_frame (target, 0, cur_thread.GetFrameAtIndex(0).GetPC(), initial_fp) 72a5445d5012a890ca08676773d5f27393ab0d4f2dJason Molenda print_stack_frame (process, initial_fp) 73ff1bf4d8390a38a443d749d6e5845264771d9bc2Jason Molenda print "" 740017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if this_module != None: 750017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda module_list.append (this_module) 760017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if cur_thread.GetNumFrames() < 2: 77297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda return [module_list, address_list] 780017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 790017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda cur_fp = process.ReadPointerFromMemory (initial_fp, lldb.SBError()) 800017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda cur_pc = process.ReadPointerFromMemory (initial_fp + process.GetAddressByteSize(), lldb.SBError()) 81848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 82848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda frame_num = 1 83848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 84848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda while cur_pc != 0 and cur_fp != 0 and cur_pc != lldb.LLDB_INVALID_ADDRESS and cur_fp != lldb.LLDB_INVALID_ADDRESS: 850017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda address_list.append (cur_pc) 860017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda this_module = backtrace_print_frame (target, frame_num, cur_pc, cur_fp) 87297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda print_stack_frame (process, cur_fp) 88297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda print "" 890017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if this_module != None: 900017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda module_list.append (this_module) 91848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda frame_num = frame_num + 1 92848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda next_pc = 0 93848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda next_fp = 0 94848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if target.triple[0:6] == "x86_64" or target.triple[0:4] == "i386" or target.triple[0:3] == "arm": 95848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda error = lldb.SBError() 96848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda next_pc = process.ReadPointerFromMemory(cur_fp + process.GetAddressByteSize(), error) 97848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if not error.Success(): 98848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda next_pc = 0 99848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda next_fp = process.ReadPointerFromMemory(cur_fp, error) 100848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if not error.Success(): 101848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda next_fp = 0 102848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda # Clear the 0th bit for arm frames - this indicates it is a thumb frame 103848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if target.triple[0:3] == "arm" and (next_pc & 1) == 1: 104848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda next_pc = next_pc & ~1 105848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda cur_pc = next_pc 106848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda cur_fp = next_fp 1070017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda this_module = backtrace_print_frame (target, frame_num, cur_pc, cur_fp) 108297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda print_stack_frame (process, cur_fp) 109297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda print "" 1100017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if this_module != None: 1110017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda module_list.append (this_module) 1120017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda return [module_list, address_list] 113848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 114297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molendadef print_stack_frame(process, fp): 115297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda if fp == 0 or fp == lldb.LLDB_INVALID_ADDRESS or fp == 1: 116297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda return 117297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda addr_size = process.GetAddressByteSize() 118297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda addr = fp - (2 * addr_size) 119297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda i = 0 120297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda outline = "Stack frame from $fp-%d: " % (2 * addr_size) 121297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda error = lldb.SBError() 122297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda try: 123297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda while i < 5 and error.Success(): 124297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda address = process.ReadPointerFromMemory(addr + (i * addr_size), error) 125297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda outline += " 0x%x" % address 126297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda i += 1 127297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda print outline 128297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda except Exception: 129297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda return 130297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda 1317c5551507c126765b48fc48ffc52a659c89c9c74Jason Molendadef diagnose_unwind(debugger, command, result, dict): 13251e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda """ 13351e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason MolendaGather diagnostic information to help debug incorrect unwind (backtrace) 13451e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molendabehavior in lldb. When there is a backtrace that doesn't look 13551e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molendacorrect, run this command with the correct thread selected and a 13651e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molendalarge amount of diagnostic information will be printed, it is likely 13751e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molendato be helpful when reporting the problem. 13851e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda """ 13951e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda 140848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda command_args = shlex.split(command) 1417c5551507c126765b48fc48ffc52a659c89c9c74Jason Molenda parser = create_diagnose_unwind_options() 142848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda try: 143848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda (options, args) = parser.parse_args(command_args) 144848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda except: 145848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda return 146848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda target = debugger.GetSelectedTarget() 147848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if target: 148848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda process = target.GetProcess() 149848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if process: 150848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda thread = process.GetSelectedThread() 151848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if thread: 15283ea875d22d7fc42e80b67ff7d42b5745771999bJason Molenda lldb_versions_match = re.search(r'[lL][lL][dD][bB]-(\d+)([.](\d+))?([.](\d+))?', debugger.GetVersionString()) 153848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda lldb_version = 0 154848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda lldb_minor = 0 15583ea875d22d7fc42e80b67ff7d42b5745771999bJason Molenda if len(lldb_versions_match.groups()) >= 1 and lldb_versions_match.groups()[0]: 15683ea875d22d7fc42e80b67ff7d42b5745771999bJason Molenda lldb_major = int(lldb_versions_match.groups()[0]) 15783ea875d22d7fc42e80b67ff7d42b5745771999bJason Molenda if len(lldb_versions_match.groups()) >= 5 and lldb_versions_match.groups()[4]: 15883ea875d22d7fc42e80b67ff7d42b5745771999bJason Molenda lldb_minor = int(lldb_versions_match.groups()[4]) 159848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 1600017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda modules_seen = [] 1610017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda addresses_seen = [] 1620017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 16351e60bf97e1fa4683d2fe296c8e0ce58a42c0b94Jason Molenda print 'LLDB version %s' % debugger.GetVersionString() 164848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print 'Unwind diagnostics for thread %d' % thread.GetIndexID() 165848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 1661d37c1224b2268013b73af713aed41f228adf208Jason Molenda print "=============================================================================================" 1671d37c1224b2268013b73af713aed41f228adf208Jason Molenda print "" 16827bdcbf489ae2aa60d8f247484cd38863709ffdfJason Molenda print "OS plugin setting:" 16927bdcbf489ae2aa60d8f247484cd38863709ffdfJason Molenda debugger.HandleCommand("settings show target.process.python-os-plugin-path") 17027bdcbf489ae2aa60d8f247484cd38863709ffdfJason Molenda print "" 1711d37c1224b2268013b73af713aed41f228adf208Jason Molenda print "Live register context:" 1721d37c1224b2268013b73af713aed41f228adf208Jason Molenda thread.SetSelectedFrame(0) 1731d37c1224b2268013b73af713aed41f228adf208Jason Molenda debugger.HandleCommand("register read") 1741d37c1224b2268013b73af713aed41f228adf208Jason Molenda print "" 1751d37c1224b2268013b73af713aed41f228adf208Jason Molenda print "=============================================================================================" 1761d37c1224b2268013b73af713aed41f228adf208Jason Molenda print "" 177848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "lldb's unwind algorithm:" 178848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 179848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda frame_num = 0 180848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda for frame in thread.frames: 181848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if not frame.IsInlined(): 1820017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda this_module = backtrace_print_frame (target, frame_num, frame.GetPC(), frame.GetFP()) 183297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda print_stack_frame (process, frame.GetFP()) 184297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda print "" 1850017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if this_module != None: 1860017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda modules_seen.append (this_module) 1870017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda addresses_seen.append (frame.GetPC()) 188848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda frame_num = frame_num + 1 189848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 190848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "=============================================================================================" 191848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 192848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "Simple stack walk algorithm:" 193848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 194297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda (module_list, address_list) = simple_backtrace(debugger) 195297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda if module_list and module_list != None: 196297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda modules_seen += module_list 197297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda if address_list and address_list != None: 198297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda addresses_seen = set(addresses_seen) 199297fc67ce9907e4ccbc2a1a013bd4c593c1c9b3dJason Molenda addresses_seen.update(set(address_list)) 2000017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 201848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 202848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "=============================================================================================" 203848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 2040017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "Modules seen in stack walks:" 2050017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2060017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda modules_already_seen = set() 2070017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda for module in modules_seen: 2080017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if module != None and module.GetFileSpec().GetFilename() != None: 2090017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if not module.GetFileSpec().GetFilename() in modules_already_seen: 2100017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda debugger.HandleCommand('image list %s' % module.GetFileSpec().GetFilename()) 2110017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda modules_already_seen.add(module.GetFileSpec().GetFilename()) 2120017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 2130017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2140017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "=============================================================================================" 2150017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2160017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "Disassembly ofaddresses seen in stack walks:" 2170017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2180017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda additional_addresses_to_disassemble = addresses_seen 219848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda for frame in thread.frames: 220848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if not frame.IsInlined(): 221848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "--------------------------------------------------------------------------------------" 222848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 2230017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "Disassembly of %s, frame %d, address 0x%x" % (frame.GetFunctionName(), frame.GetFrameID(), frame.GetPC()) 224848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 2250017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if target.triple[0:6] == "x86_64" or target.triple[0:4] == "i386": 2260017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda debugger.HandleCommand('disassemble -F att -a 0x%x' % frame.GetPC()) 227848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda else: 2280017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda debugger.HandleCommand('disassemble -a 0x%x' % frame.GetPC()) 2290017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if frame.GetPC() in additional_addresses_to_disassemble: 2300017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda additional_addresses_to_disassemble.remove (frame.GetPC()) 2310017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 2320017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda for address in list(additional_addresses_to_disassemble): 2330017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "--------------------------------------------------------------------------------------" 2340017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2350017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "Disassembly of 0x%x" % address 2360017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2370017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if target.triple[0:6] == "x86_64" or target.triple[0:4] == "i386": 2380017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda debugger.HandleCommand('disassemble -F att -a 0x%x' % address) 2390017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda else: 2400017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda debugger.HandleCommand('disassemble -a 0x%x' % address) 2410017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 242848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 243848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "=============================================================================================" 244848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 2450017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda additional_addresses_to_show_unwind = addresses_seen 246848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda for frame in thread.frames: 247848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda if not frame.IsInlined(): 248848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "--------------------------------------------------------------------------------------" 249848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 250848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "Unwind instructions for %s, frame %d" % (frame.GetFunctionName(), frame.GetFrameID()) 251848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda print "" 2520017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda debugger.HandleCommand('image show-unwind -a "0x%x"' % frame.GetPC()) 2530017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda if frame.GetPC() in additional_addresses_to_show_unwind: 2540017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda additional_addresses_to_show_unwind.remove (frame.GetPC()) 2550017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda 2560017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda for address in list(additional_addresses_to_show_unwind): 2570017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "--------------------------------------------------------------------------------------" 2580017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2590017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "Unwind instructions for 0x%x" % address 2600017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda print "" 2610017b488f2dc89c28c6f58b2d3e8cefb68454cd7Jason Molenda debugger.HandleCommand('image show-unwind -a "0x%x"' % address) 262848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 2637c5551507c126765b48fc48ffc52a659c89c9c74Jason Molendadef create_diagnose_unwind_options(): 264848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda usage = "usage: %prog" 265848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda description='''Print diagnostic information about a thread backtrace which will help to debug unwind problems''' 2667c5551507c126765b48fc48ffc52a659c89c9c74Jason Molenda parser = optparse.OptionParser(description=description, prog='diagnose_unwind',usage=usage) 267848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda return parser 268848d772d2ec9fb7fe381de7a5804fddcb1a172afJason Molenda 2697c5551507c126765b48fc48ffc52a659c89c9c74Jason Molendalldb.debugger.HandleCommand('command script add -f %s.diagnose_unwind diagnose-unwind' % __name__) 2707c5551507c126765b48fc48ffc52a659c89c9c74Jason Molendaprint 'The "diagnose-unwind" command has been installed, type "help diagnose-unwind" for detailed help.' 271