how_do_i_debug_my_python_extensi.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>How do I debug my Python extensions?</title>
  5. <link rel="stylesheet" href="../boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../index.html" title="Boost.Python">
  8. <link rel="up" href="../faq.html" title="Chapter&#160;5.&#160;Frequently Asked Questions (FAQs)">
  9. <link rel="prev" href="fatal_error_c1204_compiler_limit.html" title="fatal error C1204:Compiler limit:internal structure overflow">
  10. <link rel="next" href="why_doesn_t_my_operator_work.html" title="Why doesn't my *= operator work?">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../images/boost.png"></td></tr></table>
  14. <hr>
  15. <div class="spirit-nav">
  16. <a accesskey="p" href="fatal_error_c1204_compiler_limit.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="why_doesn_t_my_operator_work.html"><img src="../images/next.png" alt="Next"></a>
  17. </div>
  18. <div class="section">
  19. <div class="titlepage"><div><div><h3 class="title">
  20. <a name="faq.how_do_i_debug_my_python_extensi"></a><a class="link" href="how_do_i_debug_my_python_extensi.html" title="How do I debug my Python extensions?">How do I debug
  21. my Python extensions?</a>
  22. </h3></div></div></div>
  23. <p>
  24. Greg Burley gives the following answer for Unix GCC users:
  25. </p>
  26. <div class="blockquote"><blockquote class="blockquote">
  27. <p>
  28. Once you have created a boost python extension for your c++ library or
  29. class, you may need to debug the code. Afterall this is one of the reasons
  30. for wrapping the library in python. An expected side-effect or benefit
  31. of using BPL is that debugging should be isolated to the c++ library that
  32. is under test, given that python code is minimal and boost::python either
  33. works or it doesn't. (ie. While errors can occur when the wrapping method
  34. is invalid, most errors are caught by the compiler ;-).
  35. </p>
  36. <p>
  37. The basic steps required to initiate a gdb session to debug a c++ library
  38. via python are shown here. Note, however that you should start the gdb
  39. session in the directory that contains your BPL my_ext.so module.
  40. </p>
  41. <pre class="programlisting"><span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="identifier">target</span> <span class="identifier">exec</span> <span class="identifier">python</span>
  42. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="identifier">run</span>
  43. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">from</span> <span class="identifier">my_ext</span> <span class="identifier">import</span> <span class="special">*</span>
  44. <span class="special">&gt;&gt;&gt;</span> <span class="special">[</span><span class="identifier">C</span><span class="special">-</span><span class="identifier">c</span><span class="special">]</span>
  45. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="keyword">break</span> <span class="identifier">MyClass</span><span class="special">::</span><span class="identifier">MyBuggyFunction</span>
  46. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="identifier">cont</span>
  47. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">pyobj</span> <span class="special">=</span> <span class="identifier">MyClass</span><span class="special">()</span>
  48. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">pyobj</span><span class="special">.</span><span class="identifier">MyBuggyFunction</span><span class="special">()</span>
  49. <span class="identifier">Breakpoint</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">MyClass</span><span class="special">::</span><span class="identifier">MyBuggyFunction</span> <span class="special">...</span>
  50. <span class="identifier">Current</span> <span class="identifier">language</span><span class="special">:</span> <span class="keyword">auto</span><span class="special">;</span> <span class="identifier">currently</span> <span class="identifier">c</span><span class="special">++</span>
  51. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="keyword">do</span> <span class="identifier">debugging</span> <span class="identifier">stuff</span>
  52. </pre>
  53. </blockquote></div>
  54. <p>
  55. Greg's approach works even better using Emacs' "gdb" command, since
  56. it will show you each line of source as you step through it.
  57. </p>
  58. <p>
  59. On <span class="bold"><strong>Windows</strong></span>, my favorite debugging solution
  60. is the debugger that comes with Microsoft Visual C++ 7. This debugger seems
  61. to work with code generated by all versions of Microsoft and Metrowerks toolsets;
  62. it's rock solid and "just works" without requiring any special
  63. tricks from the user.
  64. </p>
  65. <p>
  66. Raoul Gough has provided the following for gdb on Windows:
  67. </p>
  68. <div class="blockquote"><blockquote class="blockquote">
  69. <p>
  70. gdb support for Windows DLLs has improved lately, so it is now possible
  71. to debug Python extensions using a few tricks. Firstly, you will need an
  72. up-to-date gdb with support for minimal symbol extraction from a DLL. Any
  73. gdb from version 6 onwards, or Cygwin gdb-20030214-1 and onwards should
  74. do. A suitable release will have a section in the gdb.info file under Configuration
  75. - Native - Cygwin Native - Non-debug DLL symbols. Refer to that info section
  76. for more details of the procedures outlined here.
  77. </p>
  78. <p>
  79. Secondly, it seems necessary to set a breakpoint in the Python interpreter,
  80. rather than using ^C to break execution. A good place to set this breakpoint
  81. is PyOS_Readline, which will stop execution immediately before reading
  82. each interactive Python command. You have to let Python start once under
  83. the debugger, so that it loads its own DLL, before you can set the breakpoint:
  84. </p>
  85. <pre class="programlisting"><span class="error">$</span> <span class="identifier">gdb</span> <span class="identifier">python</span>
  86. <span class="identifier">GNU</span> <span class="identifier">gdb</span> <span class="number">2003</span><span class="special">-</span><span class="number">09</span><span class="special">-</span><span class="number">02</span><span class="special">-</span><span class="identifier">cvs</span> <span class="special">(</span><span class="identifier">cygwin</span><span class="special">-</span><span class="identifier">special</span><span class="special">)</span>
  87. <span class="special">[...]</span>
  88. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="identifier">run</span>
  89. <span class="identifier">Starting</span> <span class="identifier">program</span><span class="special">:</span> <span class="special">/</span><span class="identifier">cygdrive</span><span class="special">/</span><span class="identifier">c</span><span class="special">/</span><span class="identifier">Python22</span><span class="special">/</span><span class="identifier">python</span><span class="special">.</span><span class="identifier">exe</span>
  90. <span class="identifier">Python</span> <span class="number">2.2</span><span class="special">.</span><span class="number">2</span> <span class="special">(#</span><span class="number">37</span><span class="special">,</span> <span class="identifier">Oct</span> <span class="number">14</span> <span class="number">2002</span><span class="special">,</span> <span class="number">17</span><span class="special">:</span><span class="number">02</span><span class="special">:</span><span class="number">34</span><span class="special">)</span> <span class="special">[</span><span class="identifier">MSC</span> <span class="number">32</span> <span class="identifier">bit</span> <span class="special">(</span><span class="identifier">Intel</span><span class="special">)]</span> <span class="identifier">on</span> <span class="identifier">win32</span>
  91. <span class="identifier">Type</span> <span class="string">"help"</span><span class="special">,</span> <span class="string">"copyright"</span><span class="special">,</span> <span class="string">"credits"</span> <span class="keyword">or</span> <span class="string">"license"</span> <span class="keyword">for</span> <span class="identifier">more</span> <span class="identifier">information</span><span class="special">.</span>
  92. <span class="special">&gt;&gt;&gt;</span> <span class="special">^</span><span class="identifier">Z</span>
  93. <span class="identifier">Program</span> <span class="identifier">exited</span> <span class="identifier">normally</span><span class="special">.</span>
  94. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="keyword">break</span> <span class="special">*&amp;</span><span class="identifier">PyOS_Readline</span>
  95. <span class="identifier">Breakpoint</span> <span class="number">1</span> <span class="identifier">at</span> <span class="number">0x1e04eff0</span>
  96. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="identifier">run</span>
  97. <span class="identifier">Starting</span> <span class="identifier">program</span><span class="special">:</span> <span class="special">/</span><span class="identifier">cygdrive</span><span class="special">/</span><span class="identifier">c</span><span class="special">/</span><span class="identifier">Python22</span><span class="special">/</span><span class="identifier">python</span><span class="special">.</span><span class="identifier">exe</span>
  98. <span class="identifier">Python</span> <span class="number">2.2</span><span class="special">.</span><span class="number">2</span> <span class="special">(#</span><span class="number">37</span><span class="special">,</span> <span class="identifier">Oct</span> <span class="number">14</span> <span class="number">2002</span><span class="special">,</span> <span class="number">17</span><span class="special">:</span><span class="number">02</span><span class="special">:</span><span class="number">34</span><span class="special">)</span> <span class="special">[</span><span class="identifier">MSC</span> <span class="number">32</span> <span class="identifier">bit</span> <span class="special">(</span><span class="identifier">Intel</span><span class="special">)]</span> <span class="identifier">on</span> <span class="identifier">win32</span>
  99. <span class="identifier">Type</span> <span class="string">"help"</span><span class="special">,</span> <span class="string">"copyright"</span><span class="special">,</span> <span class="string">"credits"</span> <span class="keyword">or</span> <span class="string">"license"</span> <span class="keyword">for</span> <span class="identifier">more</span> <span class="identifier">information</span><span class="special">.</span>
  100. <span class="identifier">Breakpoint</span> <span class="number">1</span><span class="special">,</span> <span class="number">0x1e04eff0</span> <span class="identifier">in</span> <span class="identifier">python22</span><span class="special">!</span><span class="identifier">PyOS_Readline</span> <span class="special">()</span>
  101. <span class="identifier">from</span> <span class="special">/</span><span class="identifier">cygdrive</span><span class="special">/</span><span class="identifier">c</span><span class="special">/</span><span class="identifier">WINNT</span><span class="special">/</span><span class="identifier">system32</span><span class="special">/</span><span class="identifier">python22</span><span class="special">.</span><span class="identifier">dll</span>
  102. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="identifier">cont</span>
  103. <span class="identifier">Continuing</span><span class="special">.</span>
  104. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">from</span> <span class="identifier">my_ext</span> <span class="identifier">import</span> <span class="special">*</span>
  105. <span class="identifier">Breakpoint</span> <span class="number">1</span><span class="special">,</span> <span class="number">0x1e04eff0</span> <span class="identifier">in</span> <span class="identifier">python22</span><span class="special">!</span><span class="identifier">PyOS_Readline</span> <span class="special">()</span>
  106. <span class="identifier">from</span> <span class="special">/</span><span class="identifier">cygdrive</span><span class="special">/</span><span class="identifier">c</span><span class="special">/</span><span class="identifier">WINNT</span><span class="special">/</span><span class="identifier">system32</span><span class="special">/</span><span class="identifier">python22</span><span class="special">.</span><span class="identifier">dll</span>
  107. <span class="special">(</span><span class="identifier">gdb</span><span class="special">)</span> <span class="special">#</span> <span class="identifier">my_ext</span> <span class="identifier">now</span> <span class="identifier">loaded</span> <span class="special">(</span><span class="identifier">with</span> <span class="identifier">any</span> <span class="identifier">debugging</span> <span class="identifier">symbols</span> <span class="identifier">it</span> <span class="identifier">contains</span><span class="special">)</span>
  108. </pre>
  109. </blockquote></div>
  110. <h3>
  111. <a name="faq.how_do_i_debug_my_python_extensi.h0"></a>
  112. <span class="phrase"><a name="faq.how_do_i_debug_my_python_extensi.debugging_extensions_through_boo"></a></span><a class="link" href="how_do_i_debug_my_python_extensi.html#faq.how_do_i_debug_my_python_extensi.debugging_extensions_through_boo">Debugging
  113. extensions through Boost.Build</a>
  114. </h3>
  115. <p>
  116. If you are launching your extension module tests with <a href="http://www.boost.org/build" target="_top">Boost.Build</a>
  117. using the <code class="computeroutput"><span class="identifier">boost</span><span class="special">-</span><span class="identifier">python</span><span class="special">-</span><span class="identifier">runtest</span></code> rule, you can ask it to launch
  118. your debugger for you by adding "--debugger=<span class="emphasis"><em>debugger</em></span>"
  119. to your bjam command-line:
  120. </p>
  121. <pre class="programlisting"><span class="identifier">bjam</span> <span class="special">-</span><span class="identifier">sTOOLS</span><span class="special">=</span><span class="identifier">vc7</span><span class="special">.</span><span class="number">1</span> <span class="string">"--debugger=devenv /debugexe"</span> <span class="identifier">test</span>
  122. <span class="identifier">bjam</span> <span class="special">-</span><span class="identifier">sTOOLS</span><span class="special">=</span><span class="identifier">gcc</span> <span class="special">-</span><span class="identifier">sPYTHON_LAUNCH</span><span class="special">=</span><span class="identifier">gdb</span> <span class="identifier">test</span>
  123. </pre>
  124. <p>
  125. It can also be extremely useful to add the <code class="computeroutput"><span class="special">-</span><span class="identifier">d</span><span class="special">+</span><span class="number">2</span></code>
  126. option when you run your test, because Boost.Build will then show you the
  127. exact commands it uses to invoke it. This will invariably involve setting
  128. up PYTHONPATH and other important environment variables such as LD_LIBRARY_PATH
  129. which may be needed by your debugger in order to get things to work right.
  130. </p>
  131. </div>
  132. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  133. <td align="left"></td>
  134. <td align="right"><div class="copyright-footer">Copyright &#169; 2002-2015 David
  135. Abrahams, Stefan Seefeld<p>
  136. Distributed under the Boost Software License, Version 1.0. (See accompanying
  137. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  138. </p>
  139. </div></td>
  140. </tr></table>
  141. <hr>
  142. <div class="spirit-nav">
  143. <a accesskey="p" href="fatal_error_c1204_compiler_limit.html"><img src="../images/prev.png" alt="Prev"></a><a accesskey="u" href="../faq.html"><img src="../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="why_doesn_t_my_operator_work.html"><img src="../images/next.png" alt="Next"></a>
  144. </div>
  145. </body>
  146. </html>