attachment upload
[openafs-wiki.git] / AFSLore / debugging / threadLogParser.py
1 #!/usr/bin/python 
2
3 import sys,getopt
4
5 def usage():
6     print "Usage : --thread-file=filename --in-function=<function-name>, --exclude-function=<function-name>,<function-name>"
7     print "--in-function :  show only threads whose stack has functions of name <function-name> (or part thereof)"
8     print "--exclude-function :  do not show threads whose stack has functions of name <function-name> (or part thereof)"
9     sys.exit(2)
10
11 try:
12     opts, args = getopt.getopt(sys.argv[1:], "hg:i:e:", ["help", "gdb-output-file","in-function","exclude-function"])
13 except getopt.GetoptError, err:
14     # print help information and exit:
15     print str(err) # will print something like "option -a not recognized"
16     usage()
17     sys.exit(2)
18
19 gdb_ofile="gdb.out"
20 includes=""
21 excludes=[]
22
23 for o, a in opts:
24     if o in ("-h", "--help"):
25         usage()
26         sys.exit()
27     elif o in ("-g", "--gdb-output-file") :
28         gdb_ofile=a
29     elif o in ('-i', "--in-function") :
30         include=a
31     elif o in ('-e', "--exclude-function") :
32        excludes=a.split(",")
33     else :
34         print "Unknown option %s" % o
35         sys.exit(2)
36
37 Threads={}
38 f=file(gdb_ofile,"r")
39 skipnextLine=False
40 while 1: 
41     if not skipnextLine :
42         line=f.readline()   
43     else :
44         skipnextLine=False 
45     if not line: break
46     line=line.strip()
47     if len(line) == 0 : continue
48     if "to continue, or q" in line : continue
49     tokens=line.split()
50     if tokens[0] == "Thread" :
51         thisThread=[]
52         useThread=True
53         hasKeyword=False
54         while 1 :
55             line=f.readline()
56             if not line : break
57             if "to continue, or q" in line : continue
58             line=line.strip()
59             if len(line) == 0 : break
60             ttokens=line.split()
61             if ttokens[0] == "Thread" :  
62                 skipnextLine = True
63                 break
64             if line[0] != "#" :
65                 line += f.readline().strip()
66             thisThread.append(line)
67             for e in excludes :
68                 if e in line :
69                     useThread=False
70             if includes in line : 
71                 hasKeyword=True 
72         if useThread and hasKeyword :
73             Threads[tokens[1]]=thisThread
74                        
75 for t in Threads :
76     print "Thread %s" % t 
77     for line in  Threads[t] :
78        print line
79     print