There's a good article details how to control GDB via Python instead of GDB script, please refer: http://www.linuxjournal.com/article/11027.
However due to time evolves, the Python scripts seems to stop working. The following is a modified one to compatible with the example giving in the article.
However due to time evolves, the Python scripts seems to stop working. The following is a modified one to compatible with the example giving in the article.
#!/usr/local/bin/python from collections import defaultdict # A dictionary of mutex:owner mutexOwners = {} # A dictionary of blocking mutex:(threads..) threadBlockers = defaultdict(list) # Print the threads #print "Process threads : " #gdb.execute("info threads") print "Analysing mutexes..." # Step through processes running under gdb def get_frame(hint): frame = gdb.selected_frame() if hint == None: return frame elif type(hint) == int: i = 0 while i < hint and frame != None: pre_frame = frame.older() if frame == pre_frame and frame < hint - 1: frame = None break else: frame = new_frame i += 1 elif type(hint) == str: while frame != None: pre_frame = frame.older() if frame.name() == hint or pre_frame == frame: break else: frame = pre_frame return frame for process in gdb.inferiors(): # Step through each thread in the process for thread in process.threads(): # Examine the thread -- is it blocking on a mutex? thread.switch() frame = get_frame("pthread_mutex_lock") if frame != None: frame.select() # Make a note of which thread blocks on which mutex mutex = int(gdb.parse_and_eval("$r8")) threadBlockers[mutex].append(thread.ptid[0]) # Make a note of which thread owns this mutex if not mutex in mutexOwners: v = gdb.parse_and_eval("*$r8").cast(gdb.lookup_type("pthread_mutex_t")) mutexOwners[mutex] = v['__data']['__owner'] # Print the results of the analysis for mutex in mutexOwners: print " Mutex 0x%x :" % mutex print " -> held by thread : %d" % mutexOwners[mutex] s = ["%d" % t for t in threadBlockers[mutex]] print " -> blocks threads : %s" % ' '.join(s)
No comments:
Post a Comment