{"id":720,"date":"2017-04-12T19:06:36","date_gmt":"2017-04-12T11:06:36","guid":{"rendered":"http:\/\/192.168.1.20\/?p=720"},"modified":"2017-10-23T11:52:49","modified_gmt":"2017-10-23T03:52:49","slug":"python-debug-{d4daabd1ba368d9860c36387ddb72bbda14f8f9559d69d60a952800885260c03}e6{d4daabd1ba368d9860c36387ddb72bbda14f8f9559d69d60a952800885260c03}a8{47dd41ec6bdcbd9a214c783a3735392b82ea6d1d918378c5a5","status":"publish","type":"post","link":"http:\/\/alextop.top\/?p=720","title":{"rendered":"Python debug \u6a21\u5757\u4e4bpdb\u7ffb\u8bd1\u6536\u85cf"},"content":{"rendered":"<div class=\"article_title\">\n<h1><span class=\"link_title\"><a href=\"http:\/\/blog.csdn.net\/carolzhang8406\/article\/details\/6923997\">Python debug \u6a21\u5757\u4e4bpdb&#8211;\uff08\u4e00\uff09<\/a><\/span><\/h1>\n<\/div>\n<div class=\"article_manage clearfix\">\n<div class=\"article_l\"><\/div>\n<div class=\"article_r\"><span class=\"link_postdate\">2011-11-01 11:28<\/span><\/div>\n<\/div>\n<div id=\"embody\" class=\"embody\"><\/div>\n<div class=\"category clearfix\"><\/div>\n<div><\/div>\n<div><\/div>\n<div id=\"article_content\" class=\"article_content\">\n<p>\u53c2\u8003\u6587\u4ef6http:\/\/pythonconquerstheuniverse.wordpress.com\/category\/<a class=\"replace_word\" title=\"Python\u77e5\u8bc6\u5e93\" href=\"http:\/\/lib.csdn.net\/base\/python\" target=\"_blank\">Python<\/a>-debugger\/<\/p>\n<p>\u7ffb\u8bd1\u4e0d\u662f\u4e00\u4e00\u5bf9\u5e94<\/p>\n<p>Debug\u529f\u80fd\u5bf9\u4e8edeveloper\u662f\u975e\u5e38\u91cd\u8981\u7684\uff0cpython\u63d0\u4f9b\u4e86\u76f8\u5e94\u7684\u6a21\u5757pdb\u8ba9\u4f60\u53ef\u4ee5\u5728\u7528\u6587\u672c\u7f16\u8f91\u5668\u5199\u811a\u672c\u7684\u60c5\u51b5\u4e0b\u8fdb\u884cdebug. pdb\u662fpython debugger\u7684\u7b80\u79f0\u3002<\/p>\n<p>\u5e38\u7528\u7684\u4e00\u4e9b\u547d\u4ee4\u5982\u4e0b\uff1a<\/p>\n<table class=\"data   \" border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n<thead>\n<tr>\n<th>\u547d\u4ee4<\/th>\n<th>\u7528\u9014<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>break \u6216 b<\/td>\n<td>\u8bbe\u7f6e\u65ad\u70b9<\/td>\n<\/tr>\n<tr>\n<td>continue \u6216 c<\/td>\n<td>\u7ee7\u7eed\u6267\u884c\u7a0b\u5e8f<\/td>\n<\/tr>\n<tr>\n<td>list \u6216 l<\/td>\n<td>\u67e5\u770b\u5f53\u524d\u884c\u7684\u4ee3\u7801\u6bb5<\/td>\n<\/tr>\n<tr>\n<td>step \u6216 s<\/td>\n<td>\u8fdb\u5165\u51fd\u6570<\/td>\n<\/tr>\n<tr>\n<td>return \u6216 r<\/td>\n<td>\u6267\u884c\u4ee3\u7801\u76f4\u5230\u4ece\u5f53\u524d\u51fd\u6570\u8fd4\u56de<\/td>\n<\/tr>\n<tr>\n<td>exit \u6216 q<\/td>\n<td>\u4e2d\u6b62\u5e76\u9000\u51fa<\/td>\n<\/tr>\n<tr>\n<td>next \u6216 n<\/td>\n<td>\u6267\u884c\u4e0b\u4e00\u884c<\/td>\n<\/tr>\n<tr>\n<td>pp<\/td>\n<td>\u6253\u5370\u53d8\u91cf\u7684\u503c<\/td>\n<\/tr>\n<tr>\n<td>help<\/td>\n<td>\u5e2e\u52a9<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5f00\u59cb\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528pdb\u3002<\/p>\n<p>\u4f7f\u7528\u7684<a class=\"replace_word\" title=\"\u8f6f\u4ef6\u6d4b\u8bd5\u77e5\u8bc6\u5e93\" href=\"http:\/\/lib.csdn.net\/base\/softwaretest\" target=\"_blank\">\u6d4b\u8bd5<\/a>\u4ee3\u78011\uff1a\u00a0epdb1.py<\/p>\n<p>import pdb<br \/>\na = &#8220;aaa&#8221;<br \/>\npdb.set_trace()<br \/>\nb = &#8220;bbb&#8221;<br \/>\nc = &#8220;ccc&#8221;<br \/>\nfinal = a + b + c<br \/>\nprint final<br \/>\n\u5173\u4e8eset_trace()<tt class=\"descclassname\"><br \/>\npdb.<\/tt><tt class=\"descname\">set_trace<\/tt><big>(<\/big><big>)<\/big><a class=\"headerlink\" title=\"Permalink to this definition\" href=\"http:\/\/docs.python.org\/library\/pdb.html#pdb.set_trace\">\u00b6<\/a><\/p>\n<dl class=\"function\">\n<dd>Enter the debugger at the calling stack frame. This is useful to hard-code abreakpoint at a given point in a program, even if the code is not otherwisebeing debugged (e.g. when an assertion fails).<\/dd>\n<\/dl>\n<p>1 \u5f00\u59cb\u8c03\u8bd5\uff1a[root@rcc-pok-idg-2255 ~]#\u00a0 python epdb1.py<br \/>\n&gt; \/root\/epdb1.py(4)?()<br \/>\n-&gt; b = &#8220;bbb&#8221;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb1.py(5)?()<br \/>\n-&gt; c = &#8220;ccc&#8221;<br \/>\n(Pdb)<br \/>\n&gt; \/root\/epdb1.py(6)?()<br \/>\n-&gt; final = a + b + c<br \/>\n(Pdb) list<br \/>\n1\u00a0\u00a0\u00a0\u00a0 import pdb<br \/>\n2\u00a0\u00a0\u00a0\u00a0 a = &#8220;aaa&#8221;<br \/>\n3\u00a0\u00a0\u00a0\u00a0 pdb.set_trace()<br \/>\n4\u00a0\u00a0\u00a0\u00a0 b = &#8220;bbb&#8221;<br \/>\n5\u00a0\u00a0\u00a0\u00a0 c = &#8220;ccc&#8221;<br \/>\n6\u00a0 -&gt; final = a + b + c<br \/>\n7\u00a0\u00a0\u00a0\u00a0 print final<br \/>\n[EOF]<br \/>\n(Pdb)<br \/>\n[EOF]<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb1.py(7)?()<br \/>\n-&gt; print final<br \/>\n(Pdb)<\/p>\n<ol>\n<li>\u4f7f\u7528n+enter\u8868\u793a\u6267\u884c\u5f53\u524d\u7684statement\uff0c\u5728\u7b2c\u4e00\u6b21\u6309\u4e0b\u4e86n+enter\u4e4b\u540e\u53ef\u4ee5\u76f4\u63a5\u6309enter\u8868\u793a\u91cd\u590d\u6267\u884c\u4e0a\u4e00\u6761debug\u547d\u4ee4\u3002<\/li>\n<\/ol>\n<p>If you press ENTER without entering anything, pdb will re-execute the last command that you gave it.<\/p>\n<ol>\n<li>quit\u6216\u8005q\u53ef\u4ee5\u9000\u51fa\u5f53\u524d\u7684debug\uff0c\u4f46\u662fquit\u4f1a\u4ee5\u4e00\u79cd\u975e\u5e38\u7c97\u9c81\u7684\u65b9\u5f0f\u9000\u51fa\u7a0b\u5e8f\uff0c\u76f4\u63a5crash<\/li>\n<\/ol>\n<p>[root@rcc-pok-idg-2255 ~]#\u00a0 python epdb1.py<br \/>\n&gt; \/root\/epdb1.py(4)?()<br \/>\n-&gt; b = &#8220;bbb&#8221;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb1.py(5)?()<br \/>\n-&gt; c = &#8220;ccc&#8221;<br \/>\n(Pdb) q<br \/>\nTraceback (most recent call last):<br \/>\nFile &#8220;epdb1.py&#8221;, line 5, in ?<br \/>\nc = &#8220;ccc&#8221;<br \/>\nFile &#8220;epdb1.py&#8221;, line 5, in ?<br \/>\nc = &#8220;ccc&#8221;<br \/>\nFile &#8220;\/usr\/lib64\/python2.4\/bdb.py&#8221;, line 48, in trace_dispatch<br \/>\nreturn self.dispatch_line(frame)<br \/>\nFile &#8220;\/usr\/lib64\/python2.4\/bdb.py&#8221;, line 67, in dispatch_line<br \/>\nif self.quitting: raise BdbQuit<br \/>\nbdb.BdbQuit<\/p>\n<ul>\n<li>\u5728\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u6253\u5370\u53d8\u91cf\u7684\u503c\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528p\u52a0\u4e0a\u53d8\u91cf\u540d\uff0c\u4f46\u662f\u9700\u8981\u6ce8\u610f\u7684\u662f\u6253\u5370\u4ec5\u4ec5\u5728\u5f53\u524d\u7684statement\u5df2\u7ecf\u88ab\u6267\u884c\u4e86\u4e4b\u540e\u624d\u80fd\u770b\u5230\u5177\u4f53\u7684\u503c\uff0c\u5426\u5219\u4f1a\u62a5 NameError: &lt;exceptions.NameError \u3002\u3002&gt; \u9519\u8bef\u3002<\/li>\n<\/ul>\n<p>[root@rcc-pok-idg-2255 ~]#\u00a0 python epdb1.py<br \/>\n&gt; \/root\/epdb1.py(4)?()<br \/>\n-&gt; b = &#8220;bbb&#8221;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb1.py(5)?()<br \/>\n-&gt; c = &#8220;ccc&#8221;<br \/>\n(Pdb) p b<br \/>\n&#8216;bbb&#8217;<br \/>\n(Pdb)<br \/>\n&#8216;bbb&#8217;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb1.py(6)?()<br \/>\n-&gt; final = a + b + c<br \/>\n(Pdb) p c<br \/>\n&#8216;ccc&#8217;<br \/>\n(Pdb) p final<br \/>\n*** NameError: &lt;exceptions.NameError instance at 0x1551b710&gt;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb1.py(7)?()<br \/>\n-&gt; print final<br \/>\n(Pdb) p final<br \/>\n&#8216;aaabbbccc&#8217;<br \/>\n(Pdb)<\/p>\n<p>\u4f7f\u7528c\u53ef\u4ee5\u505c\u6b62\u5f53\u524d\u7684debug\u4f7f\u5f97\u7a0b\u5e8f\u7ee7\u7eed\u6267\u884c\u3002\u5982\u679c\u5728\u4e0b\u9762\u7684\u7a0b\u5e8f\u4e2d\u7ee7\u7eed\u6709set_statement()\u7684\u7533\u660e\uff0c\u5219\u53c8\u4f1a\u91cd\u65b0\u8fdb\u5165\u5230debug\u7684\u72b6\u6001\u3002<br \/>\n[root@rcc-pok-idg-2255 ~]#\u00a0 python epdb1.py<br \/>\n&gt; \/root\/epdb1.py(4)?()<br \/>\n-&gt; b = &#8220;bbb&#8221;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb1.py(5)?()<br \/>\n-&gt; c = &#8220;ccc&#8221;<br \/>\n(Pdb) c<br \/>\naaabbbccc<\/p>\n<p>\u53ef\u4ee5\u5728\u4ee3\u7801print final\u4e4b\u524d\u518d\u52a0\u4e0aset_trace()\u9a8c\u8bc1\u3002<\/p>\n<ul>\n<li>\u5982\u679c\u4ee3\u7801\u8fc7\u7a0b\uff0c\u5728debug\u7684\u65f6\u5019\u4e0d\u4e00\u5b9a\u80fd\u8bb0\u4f4f\u5f53\u524d\u7684\u4ee3\u7801\u5feb\uff0c\u5219\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528list\u6216\u8005l\u547d\u4ee4\u5728\u663e\u793a\u3002list\u4f1a\u7528\u7bad\u5934-&gt;\u6307\u5411\u5f53\u524ddebug\u7684\u8bed\u53e5<\/li>\n<\/ul>\n<p>[root@rcc-pok-idg-2255 ~]#\u00a0 python epdb1.py<br \/>\n&gt; \/root\/epdb1.py(4)?()<br \/>\n-&gt; b = &#8220;bbb&#8221;<br \/>\n(Pdb) list<br \/>\n1\u00a0\u00a0\u00a0\u00a0 import pdb<br \/>\n2\u00a0\u00a0\u00a0\u00a0 a = &#8220;aaa&#8221;<br \/>\n3\u00a0\u00a0\u00a0\u00a0 pdb.set_trace()<br \/>\n4\u00a0 -&gt; b = &#8220;bbb&#8221;<br \/>\n5\u00a0\u00a0\u00a0\u00a0 c = &#8220;ccc&#8221;<br \/>\n6\u00a0\u00a0\u00a0\u00a0 final = a + b + c<br \/>\n7\u00a0\u00a0\u00a0\u00a0 pdb.set_trace()<br \/>\n8\u00a0\u00a0\u00a0\u00a0 print final<br \/>\n[EOF]<br \/>\n(Pdb) c<br \/>\n&gt; \/root\/epdb1.py(8)?()<br \/>\n-&gt; print final<br \/>\n(Pdb) list<br \/>\n3\u00a0\u00a0\u00a0\u00a0 pdb.set_trace()<br \/>\n4\u00a0\u00a0\u00a0\u00a0 b = &#8220;bbb&#8221;<br \/>\n5\u00a0\u00a0\u00a0\u00a0 c = &#8220;ccc&#8221;<br \/>\n6\u00a0\u00a0\u00a0\u00a0 final = a + b + c<br \/>\n7\u00a0\u00a0\u00a0\u00a0 pdb.set_trace()<br \/>\n8\u00a0 -&gt; print final<br \/>\n[EOF]<br \/>\n(Pdb)<\/p>\n<p>\u5bf9\u4e8e\u4f7f\u7528\u51fd\u6570\u7684\u60c5\u51b5\u4e0b\u8fdb\u884cdebug\uff1a<\/p>\n<pre> epdb2.py --import pdb\r\n\r\ndef combine(s1,s2):      # define subroutine combine, which...\r\n    s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ...\r\n    s3 = '\"' + s3 +'\"'   # encloses it in double quotes,...\r\n    return s3            # and returns it.\r\n\r\na = \"aaa\"\r\npdb.set_trace()\r\nb = \"bbb\"\r\nc = \"ccc\"\r\nfinal = combine(a,b)\r\nprint final<\/pre>\n<p>\u5982\u679c\u76f4\u63a5\u4f7f\u7528n\u8fdb\u884cdebug\u5219\u5230final=combine\u8fd9\u53e5\u7684\u65f6\u5019\u4f1a\u5c06\u5176\u5f53\u505a\u666e\u901a\u7684\u8d4b\u503c\u8bed\u53e5\u5904\u7406\uff0c\u8fdb\u5165\u5230print final\u3002\u5982\u679c\u60f3\u8981\u5bf9\u51fd\u6570\u8fdb\u884cdebug\u5982\u4f55\u5904\u7406\uff1f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528s\u8fdb\u5165\u51fd\u6570\u5757\u3002[root@rcc-pok-idg-2255 ~]# python epdb2.py<br \/>\n&gt; \/root\/epdb2.py(10)?()<br \/>\n-&gt; b = &#8220;bbb&#8221;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb2.py(11)?()<br \/>\n-&gt; c = &#8220;ccc&#8221;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb2.py(12)?()<br \/>\n-&gt; final = combine(a,b)<br \/>\n(Pdb) s<br \/>\n&#8211;Call&#8211;<br \/>\n&gt; \/root\/epdb2.py(3)combine()<br \/>\n-&gt; def combine(s1,s2):\u00a0\u00a0\u00a0\u00a0\u00a0 # define subroutine combine, which&#8230;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb2.py(4)combine()<br \/>\n-&gt; s3 = s1 + s2 + s1\u00a0\u00a0\u00a0 # sandwiches s2 between copies of s1, &#8230;<br \/>\n(Pdb) list<br \/>\n1\u00a0\u00a0\u00a0\u00a0 import pdb<br \/>\n2<br \/>\n3\u00a0\u00a0\u00a0\u00a0 def combine(s1,s2):\u00a0\u00a0\u00a0\u00a0\u00a0 # define subroutine combine, which&#8230;<br \/>\n4\u00a0 -&gt;\u00a0\u00a0\u00a0\u00a0 s3 = s1 + s2 + s1\u00a0\u00a0\u00a0 # sandwiches s2 between copies of s1, &#8230;<br \/>\n5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s3 = &#8216;&#8221;&#8216; + s3 +'&#8221;&#8216;\u00a0\u00a0 # encloses it in double quotes,&#8230;<br \/>\n6\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return s3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # and returns it.<br \/>\n7<br \/>\n8\u00a0\u00a0\u00a0\u00a0 a = &#8220;aaa&#8221;<br \/>\n9\u00a0\u00a0\u00a0\u00a0 pdb.set_trace()<br \/>\n10\u00a0\u00a0\u00a0\u00a0 b = &#8220;bbb&#8221;<br \/>\n11\u00a0\u00a0\u00a0\u00a0 c = &#8220;ccc&#8221;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb2.py(5)combine()<br \/>\n-&gt; s3 = &#8216;&#8221;&#8216; + s3 +'&#8221;&#8216;\u00a0\u00a0 # encloses it in double quotes,&#8230;<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb2.py(6)combine()<br \/>\n-&gt; return s3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # and returns it.<br \/>\n(Pdb) n<br \/>\n&#8211;Return&#8211;<br \/>\n&gt; \/root\/epdb2.py(6)combine()-&gt;'&#8221;aaabbbaaa&#8221;&#8216;<br \/>\n-&gt; return s3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # and returns it.<br \/>\n(Pdb) n<br \/>\n&gt; \/root\/epdb2.py(13)?()<br \/>\n-&gt; print final<br \/>\n(Pdb)<\/p>\n<p>\u5982\u679c\u4e0d\u60f3\u5728\u51fd\u6570\u91cc\u5355\u6b65\u8c03\u8bd5\u53ef\u4ee5\u5728\u65ad\u70b9\u51fa\u76f4\u63a5\u6309r\u9000\u51fa\u5230\u8c03\u7528\u7684\u5730\u65b9\u3002<\/p>\n<p>\u5728\u8c03\u8bd5\u7684\u65f6\u5019\u52a8\u6001\u6539\u53d8\u503c \u3002\u6ce8\u610f\u4e0b\u9762\u6709\u4e2a\u9519\u8bef\uff0c\u539f\u56e0\u662fb\u5df2\u7ecf\u88ab\u8d4b\u503c\u4e86\uff0c\u5982\u679c\u60f3\u91cd\u65b0\u6539\u53d8b\u7684\u8d4b\u503c\uff0c\u5219\u5e94\u8be5\u4f7f\u7528\uff01b<\/p>\n<p>[root@rcc-pok-idg-2255 ~]# python epdb2.py<br \/>\n&gt; \/root\/epdb2.py(10)?()<br \/>\n-&gt; b = &#8220;bbb&#8221;<br \/>\n(Pdb) var = &#8220;1234&#8221;<br \/>\n(Pdb) b = &#8220;avfe&#8221;<br \/>\n<strong>*** The specified object &#8216;= &#8220;avfe&#8221;&#8216; is not a function<br \/>\nor was not found along sys.path.<\/strong><br \/>\n(Pdb) !b=&#8221;afdfd&#8221;<br \/>\n(Pdb)<\/p>\n<p>\u518d\u8d34\u4e00\u7bc7\u597d\u6587\u7ae0\uff1ahttp:\/\/onlamp.com\/pub\/a\/python\/2005\/09\/01\/debugger.html?page=1<\/p>\n<h3><a name=\"t0\"><\/a><a id=\"debugger-module-contents\"><\/a>Debugger Module Contents<\/h3>\n<p>The <code>pdb<\/code> module contains the debugger. <code>pdb<\/code> containsone class, <code>Pdb<\/code>, which inherits from <code>bdb.Bdb<\/code>. Thedebugger documentation mentions six functions, which create an interactivedebugging session:<\/p>\n<pre><code>pdb.run(statement[, globals[, locals]])\r\npdb.runeval(expression[, globals[, locals]])\r\npdb.runcall(function[, argument, ...])\r\npdb.set_trace()\r\npdb.post_mortem(traceback)\r\npdb.pm()<\/code><\/pre>\n<p>All six functions provide a slightly different mechanism for dropping a userinto the debugger.<\/p>\n<h3><a name=\"t1\"><\/a><a id=\"pdb-run-statement-globals-locals\"><\/a><code>pdb.run(statement[, globals[, locals]])<\/code><\/h3>\n<p><code>pdb.run()<\/code> executes the string <code>statement<\/code> under thedebugger&#8217;s control. Global and local dictionaries are optional parameters:<\/p>\n<pre><code>#!\/usr\/bin\/env python\r\n\r\nimport pdb\r\n\r\ndef test_debugger(some_int):\r\n    print \"start some_int&gt;&gt;\", some_int\r\n    return_int = 10 \/ some_int\r\n    print \"end some_int&gt;&gt;\", some_int\r\n    return return_int\r\n\r\nif __name__ == \"__main__\":\r\n    pdb.run(\"test_debugger(0)\")<\/code><\/pre>\n<h3><a name=\"t2\"><\/a><a id=\"pdb-runeval-expression-globals-locals\"><\/a><code>pdb.runeval(expression[,globals[, locals]])<\/code><\/h3>\n<p><code>pdb.runeval()<\/code> is identical to <code>pdb.run()<\/code>, exceptthat <code>pdb.runeval()<\/code> returns the value of the evaluated string<code>expression<\/code>:<\/p>\n<pre><code>#!\/usr\/bin\/env python\r\n\r\nimport pdb\r\n\r\ndef test_debugger(some_int):\r\n    print \"start some_int&gt;&gt;\", some_int\r\n    return_int = 10 \/ some_int\r\n    print \"end some_int&gt;&gt;\", some_int\r\n    return return_int\r\n\r\nif __name__ == \"__main__\":\r\n    pdb.runeval(\"test_debugger(0)\")<\/code><\/pre>\n<h3><a name=\"t3\"><\/a><a id=\"pdb-runcall-function-argument\"><\/a><code>pdb.runcall(function[,argument, ...])<\/code><\/h3>\n<p><code>pdb.runcall()<\/code> calls the specified <code>function<\/code> andpasses any specified arguments to it:<\/p>\n<pre><code>#!\/usr\/bin\/env python\r\n\r\nimport pdb\r\n\r\ndef test_debugger(some_int):\r\n    print \"start some_int&gt;&gt;\", some_int\r\n    return_int = 10 \/ some_int\r\n    print \"end some_int&gt;&gt;\", some_int\r\n    return return_int\r\n\r\nif __name__ == \"__main__\":\r\n    pdb.runcall(test_debugger, 0)<\/code><\/pre>\n<h3><a name=\"t4\"><\/a><a id=\"pdb-set-trace\"><\/a><code>pdb.set_trace()<\/code><\/h3>\n<p><code>pdb.set_trace()<\/code> drops the code into the debugger when executionhits it:<\/p>\n<pre><code>#!\/usr\/bin\/env python\r\n\r\nimport pdb\r\n\r\ndef test_debugger(some_int):\r\n    pdb.set_trace()\r\n    print \"start some_int&gt;&gt;\", some_int\r\n    return_int = 10 \/ some_int\r\n    print \"end some_int&gt;&gt;\", some_int\r\n    return return_int\r\n\r\nif __name__ == \"__main__\":\r\n    test_debugger(0)<\/code><\/pre>\n<h3><a name=\"t5\"><\/a><a id=\"pdb-post-mortem-traceback\"><\/a><code>pdb.post_mortem(traceback)<\/code><\/h3>\n<p><code>pdb.post_mortem()<\/code> performs postmortem debugging of thespecified <code>traceback<\/code>:<\/p>\n<pre><code>#!\/usr\/bin\/env python\r\n\r\nimport pdb\r\n\r\ndef test_debugger(some_int):\r\n    print \"start some_int&gt;&gt;\", some_int\r\n    return_int = 10 \/ some_int\r\n    print \"end some_int&gt;&gt;\", some_int\r\n    return return_int\r\n\r\nif __name__ == \"__main__\":\r\n    try:\r\n        test_debugger(0)\r\n    except:\r\n        import sys\r\n        tb = sys.exc_info()[2]\r\n        pdb.post_mortem(tb)<\/code><\/pre>\n<h3><a name=\"t6\"><\/a><a id=\"pdb-pm\"><\/a><code>pdb.pm()<\/code><\/h3>\n<p><code>pdb.pm()<\/code> performs postmortem debugging of the tracebackcontained in <code>sys.last_traceback<\/code>:<\/p>\n<pre><code>#!\/usr\/bin\/env python\r\n\r\nimport pdb\r\nimport sys\r\n\r\ndef test_debugger(some_int):\r\n    print \"start some_int&gt;&gt;\", some_int\r\n    return_int = 10 \/ some_int\r\n    print \"end some_int&gt;&gt;\", some_int\r\n    return return_int\r\n\r\ndef do_debugger(type, value, tb):\r\n    pdb.pm()\r\n\r\nif __name__ == \"__main__\":\r\n    sys.excepthook = do_debugger\r\n    test_debugger(0)<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Python debug \u6a21\u5757&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,10],"tags":[],"class_list":["post-720","post","type-post","status-publish","format-standard","hentry","category-python","category-jishu"],"_links":{"self":[{"href":"http:\/\/alextop.top\/index.php?rest_route=\/wp\/v2\/posts\/720"}],"collection":[{"href":"http:\/\/alextop.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/alextop.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/alextop.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/alextop.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=720"}],"version-history":[{"count":1,"href":"http:\/\/alextop.top\/index.php?rest_route=\/wp\/v2\/posts\/720\/revisions"}],"predecessor-version":[{"id":988,"href":"http:\/\/alextop.top\/index.php?rest_route=\/wp\/v2\/posts\/720\/revisions\/988"}],"wp:attachment":[{"href":"http:\/\/alextop.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=720"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/alextop.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=720"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/alextop.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}