def context_backtrace(frame_count=10, with_banner=True, target=sys.stdout, width=None): result = [] if with_banner: result.append(pwndbg.ui.banner("backtrace", target=target, width=width)) this_frame = gdb.selected_frame() newest_frame = this_frame oldest_frame = this_frame for i in range(frame_count): try: candidate = oldest_frame.older() except gdb.MemoryError: break if not candidate: break oldest_frame = candidate for i in range(frame_count): candidate = newest_frame.newer() if not candidate: break newest_frame = candidate frame = newest_frame i = 0 bt_prefix = "%s" % B.config_prefix while True: prefix = bt_prefix if frame == this_frame else ' ' * len(bt_prefix) prefix = " %s" % B.prefix(prefix) addrsz = B.address(pwndbg.ui.addrsz(frame.pc())) symbol = B.symbol(pwndbg.symbol.get(frame.pc())) if symbol: addrsz = addrsz + ' ' + symbol line = map(str, (prefix, B.frame_label('%s%i' % (backtrace_frame_label, i)), addrsz)) line = ' '.join(line) result.append(line) if frame == oldest_frame: break frame = frame.older() i += 1 return result
def context_backtrace(with_banner=True, target=sys.stdout, width=None): result = [] if with_banner: result.append(pwndbg.ui.banner("backtrace", target=target, width=width)) this_frame = gdb.selected_frame() newest_frame = this_frame oldest_frame = this_frame for i in range(backtrace_lines - 1): try: candidate = oldest_frame.older() # We catch gdb.error in case of a `gdb.error: PC not saved` case except (gdb.MemoryError, gdb.error): break if not candidate: break oldest_frame = candidate for i in range(backtrace_lines - 1): candidate = newest_frame.newer() if not candidate: break newest_frame = candidate frame = newest_frame i = 0 bt_prefix = "%s" % B.config_prefix while True: prefix = bt_prefix if frame == this_frame else " " * len(bt_prefix) prefix = " %s" % B.prefix(prefix) addrsz = B.address(pwndbg.ui.addrsz(frame.pc())) symbol = B.symbol(pwndbg.symbol.get(frame.pc())) if symbol: addrsz = addrsz + " " + symbol line = map(str, (prefix, B.frame_label("%s%i" % (backtrace_frame_label, i)), addrsz)) line = " ".join(line) result.append(line) if frame == oldest_frame: break frame = frame.older() i += 1 return result
def context_backtrace(frame_count=10, with_banner=True): result = [] if with_banner: result.append(pwndbg.ui.banner("backtrace")) this_frame = gdb.selected_frame() newest_frame = this_frame oldest_frame = this_frame for i in range(frame_count): try: candidate = oldest_frame.older() except gdb.MemoryError: break if not candidate: break oldest_frame = candidate for i in range(frame_count): candidate = newest_frame.newer() if not candidate: break newest_frame = candidate frame = newest_frame i = 0 bt_prefix = "%s" % B.config_prefix while True: prefix = bt_prefix if frame == this_frame else ' ' * len(bt_prefix) prefix = " %s" % B.prefix(prefix) addrsz = B.address(pwndbg.ui.addrsz(frame.pc())) symbol = B.symbol(pwndbg.symbol.get(frame.pc())) if symbol: addrsz = addrsz + ' ' + symbol line = map(str, (prefix, B.frame_label('%s%i' % (backtrace_frame_label, i)), addrsz)) line = ' '.join(line) result.append(line) if frame == oldest_frame: break frame = frame.older() i += 1 return result