home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Lib / tb.py < prev    next >
Text File  |  1997-09-29  |  4KB  |  179 lines

  1. # Print tracebacks, with a dump of local variables.
  2. # Also an interactive stack trace browser.
  3. # Note -- this module is obsolete -- use pdb.pm() instead.
  4.  
  5. import sys
  6. import os
  7. from stat import *
  8. import string
  9. import linecache
  10.  
  11. def br(): browser(sys.last_traceback)
  12.  
  13. def tb(): printtb(sys.last_traceback)
  14.  
  15. def browser(tb):
  16.     if not tb:
  17.         print 'No traceback.'
  18.         return
  19.     tblist = []
  20.     while tb:
  21.         tblist.append(tb)
  22.         tb = tb.tb_next
  23.     ptr = len(tblist)-1
  24.     tb = tblist[ptr]
  25.     while 1:
  26.         if tb <> tblist[ptr]:
  27.             tb = tblist[ptr]
  28.             print `ptr` + ':',
  29.             printtbheader(tb)
  30.         try:
  31.             line = raw_input('TB: ')
  32.         except KeyboardInterrupt:
  33.             print '\n[Interrupted]'
  34.             break
  35.         except EOFError:
  36.             print '\n[EOF]'
  37.             break
  38.         cmd = string.strip(line)
  39.         if cmd:
  40.             if cmd == 'quit':
  41.                 break
  42.             elif cmd == 'list':
  43.                 browserlist(tb)
  44.             elif cmd == 'up':
  45.                 if ptr-1 >= 0: ptr = ptr-1
  46.                 else: print 'Bottom of stack.'
  47.             elif cmd == 'down':
  48.                 if ptr+1 < len(tblist): ptr = ptr+1
  49.                 else: print 'Top of stack.'
  50.             elif cmd == 'locals':
  51.                 printsymbols(tb.tb_frame.f_locals)
  52.             elif cmd == 'globals':
  53.                 printsymbols(tb.tb_frame.f_globals)
  54.             elif cmd in ('?', 'help'):
  55.                 browserhelp()
  56.             else:
  57.                 browserexec(tb, cmd)
  58.  
  59. def browserlist(tb):
  60.     filename = tb.tb_frame.f_code.co_filename
  61.     lineno = tb.tb_lineno
  62.     last = lineno
  63.     first = max(1, last-10)
  64.     for i in range(first, last+1):
  65.         if i == lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
  66.         else: prefix = string.rjust(`i`, 7) + ':'
  67.         line = linecache.getline(filename, i)
  68.         if line[-1:] == '\n': line = line[:-1]
  69.         print prefix + line
  70.  
  71. def browserexec(tb, cmd):
  72.     locals = tb.tb_frame.f_locals
  73.     globals = tb.tb_frame.f_globals
  74.     try:
  75.         exec cmd+'\n' in globals, locals
  76.     except:
  77.         t, v = sys.exc_info()[:2]
  78.         print '*** Exception:',
  79.         if type(t) == type(''):
  80.             print t,
  81.         else:
  82.             print t.__name__,
  83.         if v <> None:
  84.             print ':', v,
  85.         print
  86.         print 'Type help to get help.'
  87.  
  88. def browserhelp():
  89.     print
  90.     print '    This is the traceback browser.  Commands are:'
  91.     print '        up      : move one level up in the call stack'
  92.     print '        down    : move one level down in the call stack'
  93.     print '        locals  : print all local variables at this level'
  94.     print '        globals : print all global variables at this level'
  95.     print '        list    : list source code around the failure'
  96.     print '        help    : print help (what you are reading now)'
  97.     print '        quit    : back to command interpreter'
  98.     print '    Typing any other 1-line statement will execute it'
  99.     print '    using the current level\'s symbol tables'
  100.     print
  101.  
  102. def printtb(tb):
  103.     while tb:
  104.         print1tb(tb)
  105.         tb = tb.tb_next
  106.  
  107. def print1tb(tb):
  108.     printtbheader(tb)
  109.     if tb.tb_frame.f_locals is not tb.tb_frame.f_globals:
  110.         printsymbols(tb.tb_frame.f_locals)
  111.  
  112. def printtbheader(tb):
  113.     filename = tb.tb_frame.f_code.co_filename
  114.     lineno = tb.tb_lineno
  115.     info = '"' + filename + '"(' + `lineno` + ')'
  116.     line = linecache.getline(filename, lineno)
  117.     if line:
  118.         info = info + ': ' + string.strip(line)
  119.     print info
  120.  
  121. def printsymbols(d):
  122.     keys = d.keys()
  123.     keys.sort()
  124.     for name in keys:
  125.         print '  ' + string.ljust(name, 12) + ':',
  126.         printobject(d[name], 4)
  127.         print
  128.  
  129. def printobject(v, maxlevel):
  130.     if v == None:
  131.         print 'None',
  132.     elif type(v) in (type(0), type(0.0)):
  133.         print v,
  134.     elif type(v) == type(''):
  135.         if len(v) > 20:
  136.             print `v[:17] + '...'`,
  137.         else:
  138.             print `v`,
  139.     elif type(v) == type(()):
  140.         print '(',
  141.         printlist(v, maxlevel)
  142.         print ')',
  143.     elif type(v) == type([]):
  144.         print '[',
  145.         printlist(v, maxlevel)
  146.         print ']',
  147.     elif type(v) == type({}):
  148.         print '{',
  149.         printdict(v, maxlevel)
  150.         print '}',
  151.     else:
  152.         print v,
  153.  
  154. def printlist(v, maxlevel):
  155.     n = len(v)
  156.     if n == 0: return
  157.     if maxlevel <= 0:
  158.         print '...',
  159.         return
  160.     for i in range(min(6, n)):
  161.         printobject(v[i], maxlevel-1)
  162.         if i+1 < n: print ',',
  163.     if n > 6: print '...',
  164.  
  165. def printdict(v, maxlevel):
  166.     keys = v.keys()
  167.     n = len(keys)
  168.     if n == 0: return
  169.     if maxlevel <= 0:
  170.         print '...',
  171.         return
  172.     keys.sort()
  173.     for i in range(min(6, n)):
  174.         key = keys[i]
  175.         print `key` + ':',
  176.         printobject(v[key], maxlevel-1)
  177.         if i+1 < n: print ',',
  178.     if n > 6: print '...',
  179.