import itertools import functools from gdb.FrameIterator import FrameIterator from gdb.command.backtrace import FrameWrapper """ source -p /this/script.py set a breakpoint as usual then commands taras end """ openers = {} def report(): def sum_ls_len(values): sum = 0 files = set() for ls in values: sum = sum + len(ls) for file in ls: files.add(file) return (sum, list(files)) def compare(x, y): return y[1][0] - x[1][0] func_cost = ((key,sum_ls_len(value.values())) for (key, value) in openers.items()) ls = list(func_cost) ls.sort(compare) for (func, (cost, files)) in ls: print("%d %s %s" %(cost, func, ",".join(files))) class SavePrefixCommand (gdb.Command): "Prefix command for saving things." def __init__ (self): super (SavePrefixCommand, self).__init__ ("taras", gdb.COMMAND_SUPPORT, gdb.COMPLETE_NONE, True) def register_fopen (self, name, loc, filename): global openers try: ls = openers[name] except KeyError: ls = {} openers[name] = ls try: filels = ls[loc] filels.append(filename) except KeyError: ls[loc] = [filename] def invoke (self, arg, from_tty): newest_frame = gdb.selected_thread ().newest_frame () i = itertools.imap (FrameWrapper, FrameIterator (newest_frame)) filename = None if gdb.selected_frame().name() == "open64": #yank value out of register for syscalls filename = gdb.parse_and_eval("(char*)$rdi").string() for foo in i: sal = foo.frame.find_sal() name = foo.frame.name() func = foo.frame.function () if filename == None and func: block = func.value for sym in block: if not sym.is_argument or sym.name != "filename": continue try: filename = foo.frame.read_var(sym).string() except: pass if sal.symtab and sal.symtab.filename: fname = sal.symtab.filename if fname.find("/mozilla-central/") == -1 or fname.find("nspr") != -1: continue loc = fname + ":" + str(sal.line) #print([name, foo.block(), loc]) self.register_fopen(name, loc, filename) break; gdb.execute("continue") SavePrefixCommand()