pd
index
/home/user/cstuff/python/pd.py

utilities for debugging of python scripts. prints stack backtraces that look similar to gdb stacktrace (gdb commands bt and bt full); 
can be used instead of traceback.
 
Written by Michael Moser (c) 2015

 
Modules
       
inspect
linecache
pprint
sys
traceback

 
Functions
       
die(*msg)
receives a variable number of arguments; prints each argument (with pprint) to standard error stream, 
shows a detailed stack trace (also to standard error, see print_stack_ex, does not follow objects (follow_objects = 0); 
exit program with error (status 1)
this is similar to die built in function in perl
die2(*msg)
receives a variable number of arguments; prints each argument (with pprint) to standard error stream, 
shows a detailed stack trace (also to standard error, see print_stack_ex, does follow objects (follow_objects = 1); 
exit program with error (status 1)
this is similar to die built in function in perl
print_exception_ex(follow_objects=0, file=None)
        prints an exception with more detailed stack trace, is used as follows:
        the function is similar to traceback.print_exception , just with more detailed stack trace
 
import pd
 
try:
   <python code>
except BaseException:           
    pd.print_exception_ex()
        
    
        parameters:
        
        follow_objects - if not 0 then representation of object values is printed 
        Please note that follow_objects=1 can generate a lot of output, and can take a lot of time. (default 0)
        
        file -  print to file (default value None - print to standard error stream)
 
        example stack trace:
 
Exception: got it
 
#1  def kuku2(self = {'a': 42, 'b': [1, 2, 3, 4]}, depth = 1) at test_pd.py:29
Calls next frame at:
        raise Exception('got it') at: test_pd.py:29
 
#2  def kuku2(self = {'a': 42, 'b': [1, 2, 3, 4]}, depth = 2) at test_pd.py:28
Calls next frame at:
        kuku2( depth - 1 ) at: test_pd.py:28
 
#3  def kuku2(self = {'a': 42, 'b': [1, 2, 3, 4]}, depth = 3) at test_pd.py:28
Calls next frame at:
        kuku2( depth - 1 ) at: test_pd.py:28
 
#4  def kuku2(self = {'a': 42, 'b': [1, 2, 3, 4]}, depth = 4) at test_pd.py:28
Calls next frame at:
        kuku2( depth - 1 ) at: test_pd.py:28
 
#5  def kuku2(self = {'a': 42, 'b': [1, 2, 3, 4]}, depth = 5) at test_pd.py:28
Calls next frame at:
        kuku2( depth - 1 ) at: test_pd.py:28
 
#6  def kuku2(self = {'a': 42, 'b': [1, 2, 3, 4]}, depth = 6) at test_pd.py:28
Calls next frame at:
        kuku2( depth - 1 ) at: test_pd.py:28
 
#7  def main() at test_pd.py:44
Local variables:
n = {'a': 42, 'b': [1, 2, 3, 4]}
Calls next frame at:
        pd.print_exception_ex( follow_objects = 1 ) at: test_pd.py:44
print_stack_ex(skipframes=0, follow_objects=0, file=None, frame=None)
print stack trace from an arbitrary point in the program;
        the function is similar to traceback.print_stack , just with more detailed stack trace
 
        the stack trace includes function names, values of parameters and values of local variables. i find it easier to debug with this stack trace.
        
        parameters:
        skipframes - skip a number of frames if is not 0 (default 0)
        
        follow_objects - if not 0 then representation of object values is printed 
        Please note that follow_objects=1 can generate a lot of output, and can take a lot of time. (default 0)
        
        file -  print to file (default value None - print to standard error stream)
        
        frame - specify a start frame (default None - show from calling function; deepest frame on top marked with #1)
 
        this function is similar to traceback.print_stack , just with more detailed stack trace.
 
        works for python 2.7, should work for other versions as well
 
        example stack trace:
 
#1 def fact(n = 1) at test_pd.py:10
Local variables:
loc 2
loc2 [0]
Calls next frame at:
        pd.print_stack_ex() at: test_pd.py:10
 
#2 def fact(n = 2) at test_pd.py:8
Local variables:
loc 4
loc2 [0, 1]
Calls next frame at:
        return n * fact( n - 1 ) at: test_pd.py:8
 
#3 def fact(n = 3) at test_pd.py:8
Local variables:
loc 6
loc2 [0, 1, 2]
Calls next frame at:
        return n * fact( n - 1 ) at: test_pd.py:8
 
#4 def fact(n = 4) at test_pd.py:8
Local variables:
loc 8
loc2 [0, 1, 2, 3]
Calls next frame at:
        return n * fact( n - 1 ) at: test_pd.py:8
 
#5 def main() at test_pd.py:36
Local variables:
Calls next frame at:
        print fact(4) at: test_pd.py:36
 
#6 def <module>() at test_pd.py:53
Calls next frame at:
        main() at: test_pd.py:53

 
Data
        __all__ = ['print_stack_ex', 'print_exception_ex', 'die', 'die2']