home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / share / doc / python2.5 / gdbinit < prev    next >
Encoding:
Text File  |  2005-09-05  |  4.0 KB  |  141 lines

  1. # -*- ksh -*-
  2. #
  3. # If you use the GNU debugger gdb to debug the Python C runtime, you
  4. # might find some of the following commands useful.  Copy this to your
  5. # ~/.gdbinit file and it'll get loaded into gdb automatically when you
  6. # start it up.  Then, at the gdb prompt you can do things like:
  7. #
  8. #    (gdb) pyo apyobjectptr
  9. #    <module 'foobar' (built-in)>
  10. #    refcounts: 1
  11. #    address    : 84a7a2c
  12. #    $1 = void
  13. #    (gdb)
  14.  
  15. # Prints a representation of the object to stderr, along with the
  16. # number of reference counts it current has and the hex address the
  17. # object is allocated at.  The argument must be a PyObject*
  18. define pyo
  19. print _PyObject_Dump($arg0)
  20. end
  21.  
  22. # Prints a representation of the object to stderr, along with the
  23. # number of reference counts it current has and the hex address the
  24. # object is allocated at.  The argument must be a PyGC_Head*
  25. define pyg
  26. print _PyGC_Dump($arg0)
  27. end
  28.  
  29. # print the local variables of the current frame
  30. define pylocals
  31.     set $_i = 0
  32.     while $_i < f->f_nlocals
  33.     if f->f_localsplus + $_i != 0
  34.         set $_names = co->co_varnames
  35.         set $_name = PyString_AsString(PyTuple_GetItem($_names, $_i))
  36.         printf "%s:\n", $_name
  37.         # side effect of calling _PyObject_Dump is to dump the object's
  38.         # info - assigning just prevents gdb from printing the
  39.         # NULL return value
  40.         set $_val = _PyObject_Dump(f->f_localsplus[$_i])
  41.     end
  42.         set $_i = $_i + 1
  43.     end
  44. end
  45.  
  46. # A rewrite of the Python interpreter's line number calculator in GDB's
  47. # command language
  48. define lineno
  49.     set $__continue = 1
  50.     set $__co = f->f_code
  51.     set $__lasti = f->f_lasti
  52.     set $__sz = ((PyStringObject *)$__co->co_lnotab)->ob_size/2
  53.     set $__p = (unsigned char *)((PyStringObject *)$__co->co_lnotab)->ob_sval
  54.     set $__li = $__co->co_firstlineno
  55.     set $__ad = 0
  56.     while ($__sz-1 >= 0 && $__continue)
  57.       set $__sz = $__sz - 1
  58.       set $__ad = $__ad + *$__p
  59.       set $__p = $__p + 1
  60.       if ($__ad > $__lasti)
  61.     set $__continue = 0
  62.       end
  63.       set $__li = $__li + *$__p
  64.       set $__p = $__p + 1
  65.     end
  66.     printf "%d", $__li
  67. end
  68.  
  69. # print the current frame - verbose
  70. define pyframev
  71.     pyframe
  72.     pylocals
  73. end
  74.  
  75. define pyframe
  76.     set $__fn = (char *)((PyStringObject *)co->co_filename)->ob_sval
  77.     set $__n = (char *)((PyStringObject *)co->co_name)->ob_sval
  78.     printf "%s (", $__fn
  79.     lineno
  80.     printf "): %s\n", $__n
  81. ### Uncomment these lines when using from within Emacs/XEmacs so it will
  82. ### automatically track/display the current Python source line
  83. #    printf "%c%c%s:", 032, 032, $__fn
  84. #    lineno
  85. #    printf ":1\n"
  86. end
  87.  
  88. ### Use these at your own risk.  It appears that a bug in gdb causes it
  89. ### to crash in certain circumstances.
  90.  
  91. #define up
  92. #    up-silently 1
  93. #    printframe
  94. #end
  95.  
  96. #define down
  97. #    down-silently 1
  98. #    printframe
  99. #end
  100.  
  101. define printframe
  102.     if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
  103.     pyframe
  104.     else
  105.         frame
  106.     end
  107. end
  108.  
  109. # Here's a somewhat fragile way to print the entire Python stack from gdb.
  110. # It's fragile because the tests for the value of $pc depend on the layout
  111. # of specific functions in the C source code.
  112.  
  113. # Explanation of while and if tests: We want to pop up the stack until we
  114. # land in Py_Main (this is probably an incorrect assumption in an embedded
  115. # interpreter, but the test can be extended by an interested party).  If
  116. # Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while
  117. # tests succeeds as long as it's not true.  In a similar fashion the if
  118. # statement tests to see if we are in PyEval_EvalFrame().
  119.  
  120. # print the entire Python call stack
  121. define pystack
  122.     while $pc < Py_Main || $pc > Py_GetArgcArgv
  123.         if $pc > PyEval_EvalFrame && $pc < PyEval_EvalCodeEx
  124.         pyframe
  125.         end
  126.         up-silently 1
  127.     end
  128.     select-frame 0
  129. end
  130.  
  131. # print the entire Python call stack - verbose mode
  132. define pystackv
  133.     while $pc < Py_Main || $pc > Py_GetArgcArgv
  134.         if $pc > PyEval_EvalFrame && $pc < PyEval_EvalCodeEx
  135.         pyframev
  136.         end
  137.         up-silently 1
  138.     end
  139.     select-frame 0
  140. end
  141.