Revision: 930 Author: teawater Date: Wed Feb 22 08:29:49 2012 Log: Adding hotcode http://code.google.com/p/kgtp/source/detail?r=930 Modified: /branches/hotcode/hotcode.py ======================================= --- /branches/hotcode/hotcode.py Wed Feb 22 06:15:39 2012 +++ /branches/hotcode/hotcode.py Wed Feb 22 08:29:49 2012 @@ -24,8 +24,12 @@ if s[0:1] != 'n' and s[0:1] != 'N': return; #gdb.execute("inferior 1") - gdb.execute("target remote /sys/kernel/debug/gtp", True, False) - gdb.execute("set disconnected-tracing off", True, False) + try: + gdb.execute("tfind -1", True, False) + gdb.execute("target remote /sys/kernel/debug/gtp", True, False) + gdb.execute("set disconnected-tracing off", True, False) + except:+ print "Try to stop GTP got error, please use command \"sudo rmmod gtp.ko\" stop it."
exit(1); def add_inferior(): @@ -35,6 +39,55 @@ fid = int(fid[len("Added inferior "):]) return fid +def get_addr_range_list(fun): + buf = gdb.execute("info line "+fun, False, True) + line_list = buf.split(os.linesep) + ret = [] + begin = -1 + end = -1 + for line in line_list: + addr_begin = line.find("starts at address ") + if addr_begin >= 0: + line = line[addr_begin + len("starts at address "):] + addr_end = line.find(" <"+fun) + if addr_end >= 0: + begin = int(line[:addr_end], 0) + line = line[addr_end + len(" <"+fun):] + addr_begin = line.find("ends at ") + if addr_begin >= 0: + line = line[addr_begin + len("ends at "):] + addr_end = line.find(" <"+fun) + if addr_end > 0: + end = int(line[:addr_end], 0) + if begin != -1: + ret.append([begin, end]) + begin = -1 + end = -1 + + if len(ret) > 0: + buf = gdb.execute("disassemble "+fun, False, True) + line_list = buf.split(os.linesep) + line_list.reverse() + end = 0 + for line in line_list: + addr_begin = line.find("0x") + if addr_begin >= 0: + line = line[addr_begin:] + addr_end = line.find(" <+") + if addr_end > 0: + end = int(line[:addr_end], 0) + 1 + break + if end != 0: + offset = 0 + for c in ret: + if c[1] < end: + if offset == 0 or offset > (end - c[1]): + offset = end - c[1] + for c in ret: + c[1] += offset + + return ret + #0 inferior_id 1 dir_name 2 kernel_list 3 user_list task_list = {} no_task = False @@ -159,10 +212,27 @@ gdb.execute("inferior 1") task_list[pid] = (fid, user_dir, {}, {}) +ignore_str = "" if len(task_list) == 0: trace_user = False trace_kernel = True no_task = True + #ignore arch_local_irq_enable + try:+ s = raw_input('Do you want to ignore function \"arch_local_irq_enable\"? (yes)')
+ except: + s = 'y' + if s[0:1] != 'n' and s[0:1] != 'N': + r_list = get_addr_range_list("arch_local_irq_enable") + for r in r_list: + if ignore_str != "": + ignore_str += " && " + else: + ignore_str += "&& (" + #regs->ip < r[0] || regs->ip > r[1] + ignore_str += "(regs->ip < "+str(r[0])+" || regs->ip > "+str(r[1])+")" + if ignore_str != "": + ignore_str += ")" #Set tracepoint gdb.execute("target remote /sys/kernel/debug/gtp", True, False) @@ -192,7 +262,7 @@ if pid_str != "": cond_str += "&&" cond_str = " ((regs->cs & 3) == 3)" -tempfile.write("condition $bpnum "+pid_str+cond_str+"\n") +tempfile.write("condition $bpnum "+pid_str+cond_str+ignore_str+"\n") tempfile.write("commands\n") if no_task: tempfile.write("collect $no_self_trace\n") @@ -203,6 +273,10 @@ tempfile.write("collect $current_task_pid\n") tempfile.write("end\n") tempfile.close() +tempfile = open(tempfilename, "r") +print "Tracepoint command:" +print tempfile.read() +tempfile.close() gdb.execute("source "+tempfilename, True, False) os.remove(tempfilename) gdb.execute("set disconnected-tracing on", True, False) @@ -250,6 +324,8 @@ filename_offset = sym.find(" of ") if filename_offset > 0: function += sym[filename_offset:] + if (function == "arch_local_irq_enable"): + print gdb.parse_and_eval("regs->ip - 1") task_list_add_function(is_user, pid, function) except gdb.error, x: print("Drop one entry because", x)