Revision: 1001 Author: teawater Date: Wed Mar 28 09:37:04 2012 Log: Update format. http://code.google.com/p/kgtp/source/detail?r=1001 Modified: /trunk/add-ons/hotcode.py ======================================= --- /trunk/add-ons/hotcode.py Wed Mar 28 09:27:51 2012 +++ /trunk/add-ons/hotcode.py Wed Mar 28 09:37:04 2012 @@ -11,91 +11,20 @@ debug_dir = "/usr/lib/debug/" -from operator import itemgetter -def dict_sort(d, reverse=False): - #proposed in PEP 265, using the itemgetter - return sorted(d.iteritems(), key=itemgetter(1), reverse=True) - -def sigint_handler(num, e): - hotcode_show() - try: - s = raw_input('Continue? (yes)') - except: - s = 'y' - finally: - if s[0:1] != 'n' and s[0:1] != 'N': - return; - #gdb.execute("inferior 1") - 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(): - fid = gdb.execute("add-inferior", False, True) - if fid.find("Added inferior ") != 0: - return -1 - 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 #list 0 function_list 1 file_list 2 line_list task_list = {} no_task = False kernel_hotcode_list = ({},{},{}) +#-------------------------------------------------------------------------------------------------- +#For signal handler + +from operator import itemgetter +def dict_sort(d, reverse=False): + #proposed in PEP 265, using the itemgetter + return sorted(d.iteritems(), key=itemgetter(1), reverse=True) + #info[0] line_num, info[1] file_name, info[2] function_name def add_info_to_code_list(info, code_list): #function_list @@ -156,6 +85,33 @@ hotcode_show_code_list("Hotest line", task_list[pid][3][2]) print +def sigint_handler(num, e): + hotcode_show() + try: + s = raw_input('Continue? (yes)') + except: + s = 'y' + finally: + if s[0:1] != 'n' and s[0:1] != 'N': + return; + #gdb.execute("inferior 1") + 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); +#-------------------------------------------------------------------------------------------------- +#init + +def add_inferior(): + fid = gdb.execute("add-inferior", False, True) + if fid.find("Added inferior ") != 0: + return -1 + fid = int(fid[len("Added inferior "):]) + return fid + gdb.execute("set target-async on", True, False) gdb.execute("set pagination off", True, False) gdb.execute("set confirm off", True, False) @@ -248,6 +204,55 @@ gdb.execute("inferior 1") task_list[pid] = (fid, user_dir, ({},{},{}), ({},{},{})) +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 + def get_ignore_str(function): ret = "" try: @@ -508,6 +513,9 @@ #Connect to pipe gdb.execute("target tfile /sys/kernel/debug/gtpframe_pipe") +#-------------------------------------------------------------------------------------------------- +#cycle + def get_line_from_sym(sym): sym = sym.rstrip(os.linesep)