| #!/usr/bin/python |
| |
| import os, signal, popen2 |
| |
| def getPID(dir): |
| f = open(os.path.join(dir,'info')) |
| for ln in f.readlines(): |
| if ln.startswith('PID: '): |
| return int(ln[5:]) |
| return None |
| |
| def execCmd(pid, gdbCmd, opts): |
| cmd = ("gdb " + |
| "--batch " + |
| "--pid=%d " + |
| "--eval-command=\"%s\" " + |
| "--eval-command=detach")%(pid,gdbCmd) |
| cout,cin = popen2.popen2(cmd) |
| cin.close() |
| return cout.read() |
| |
| def main(): |
| from optparse import OptionParser |
| op = OptionParser("usage: %prog <PID | test directory>") |
| op.add_option('','--backtrace', dest='backtrace', |
| action='store_true', default=False) |
| op.add_option('-s','--stop-forking', dest='stopForking', |
| action='store_true', default=False) |
| op.add_option('-H','--halt-execution', dest='haltExecution', |
| action='store_true', default=False) |
| op.add_option('-d','--dump-states', dest='dumpStates', |
| action='store_true', default=False) |
| op.add_option('-t','--dump-tree', dest='dumpTree', |
| action='store_true', default=False) |
| op.add_option('-i','--int', dest='int', |
| action='store_true', default=False) |
| op.add_option('-k','--kill', dest='kill', |
| action='store_true', default=False) |
| op.add_option('','--print-pid', dest='printPid', |
| action='store_true', default=False) |
| op.add_option('','--print-ticks', dest='printTicks', |
| action='store_true', default=False) |
| opts,args = op.parse_args() |
| |
| if len(args) != 1: |
| op.error("invalid arguments") |
| |
| try: |
| pid = int(args[0]) |
| except: |
| pid = None |
| |
| if pid is None: |
| try: |
| pid = getPID(args[0]) |
| except: |
| pid = None |
| |
| if pid is None: |
| op.error("unable to determine PID (bad pid or test directory)") |
| |
| if opts.printPid: |
| print pid |
| return |
| print 'pid: %d'%pid |
| if opts.backtrace: |
| execCmd(pid, 'bt', opts) |
| if opts.dumpStates: |
| execCmd(pid, "p dumpStates = 1", opts) |
| if opts.dumpTree: |
| execCmd(pid, "p dumpPTree = 1", opts) |
| if opts.stopForking: |
| execCmd(pid, 'p stop_forking()', opts) |
| if opts.haltExecution: |
| execCmd(pid, 'p halt_execution()', opts) |
| if opts.printTicks: |
| res = execCmd(pid, 'p timerTicks', opts) |
| lns = res.split('\n') |
| for ln in lns: |
| if ln.startswith('$1') and '=' in ln: |
| print ln.split('=',1)[1].strip() |
| if opts.int: |
| os.kill(pid, signal.SIGINT) |
| if opts.kill: |
| os.kill(pid, signal.SIGKILL) |
| |
| if __name__=='__main__': |
| main() |
| |