[kgtp] r930 committed - Adding hotcode

  • From: kgtp@xxxxxxxxxxxxxx
  • To: kgtp@xxxxxxxxxxxxx
  • Date: Wed, 22 Feb 2012 16:31:05 +0000

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)

Other related posts:

  • » [kgtp] r930 committed - Adding hotcode - kgtp