(window.webpackJsonp=window.webpackJsonp||[]).push([[2689],{3097:function(t,a,s){"use strict";s.r(a);var n=s(31),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"debugging"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#debugging"}},[t._v("#")]),t._v(" Debugging")]),t._v(" "),s("h2",{attrs:{id:"the-python-debugger-step-through-debugging-with-pdb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-python-debugger-step-through-debugging-with-pdb"}},[t._v("#")]),t._v(" The Python Debugger: Step-through Debugging with "),s("em",[t._v("pdb")])]),t._v(" "),s("p",[t._v("The "),s("a",{attrs:{href:"https://docs.python.org/2/library/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python Standard Library"),s("OutboundLink")],1),t._v(" includes an interactive debugging library called "),s("a",{attrs:{href:"https://docs.python.org/2/library/pdb.html",target:"_blank",rel:"noopener noreferrer"}},[s("strong",[t._v("pdb")]),s("OutboundLink")],1),t._v(". "),s("strong",[t._v("pdb")]),t._v(" has extensive capabilities, the most commonly used being the ability to 'step-through' a program.")]),t._v(" "),s("p",[t._v("To immediately enter into step-through debugging use:")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[t._v("python "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("m pdb "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("my_file"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("py"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\n")])])]),s("p",[t._v("This will start the debugger at the first line of the program.")]),t._v(" "),s("p",[t._v("Usually you will want to target a specific section of the code for debugging. To do this we import the pdb library and use "),s("strong",[t._v("set_trace()")]),t._v(" to interrupt the flow of this troubled example code.")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" pdb\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("divide")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_trace"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# What's wrong with this? Hint: 2 != 3")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),t._v(" divide"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Running this program will launch the interactive debugger.")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[t._v("python foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("py \n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("~")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("scratch"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("py"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("divide"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n\n")])])]),s("p",[t._v("Often this command is used on one line so it can be commented out with a single # character")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("\nimport pdf; pdb.set_trace()\n\n")])])]),s("p",[t._v("At the "),s("strong",[t._v("(Pdb)")]),t._v(" prompt commands can be entered. These commands can be debugger commands or python. To print variables we can use "),s("strong",[t._v("p")]),t._v(" from the debugger, or python's "),s("strong",[t._v("print")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p a\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),t._v(" a\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\n")])])]),s("p",[t._v("To see list of all local variables use")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("locals")]),t._v("\n\n")])])]),s("p",[t._v("build-in function")]),t._v(" "),s("p",[t._v("These are good debugger commands to know:")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[t._v("b "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("f"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("set")]),t._v(" breakpoint at line "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("or")]),t._v(" function named "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("f"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# b 3")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# b divide")]),t._v("\nb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" show "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("all")]),t._v(" breakpoints"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\nc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("continue")]),t._v(" until the "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("next")]),t._v(" breakpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\ns"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" step through this line "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("will enter a function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\nn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" step over this line "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jumps over a function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\nr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("continue")]),t._v(" until the current function returns"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\nl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("list")]),t._v(" a window of code around this line"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\np "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("var"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),t._v(" variable named "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("var"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# p x")]),t._v("\nq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" quit debugger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\nbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),t._v(" the traceback of the current execution call stack\nup"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" move your scope up the function call stack to the caller of the current function\ndown"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Move your scope back down the function call stack one level\nstep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Run the program until the "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("next")]),t._v(" line of execution "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" the program"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" then "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" control back to the debugger\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("next")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" run the program until the "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("next")]),t._v(" line of execution "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" the current function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" then "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" control back to the debugger\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" run the program until the current function returns"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" then "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" control back to the debugger\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("continue")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("continue")]),t._v(" running the program until the "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("next")]),t._v(" breakpoint "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("or")]),t._v(" set_trace si called again"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("The debugger can also evaluate python interactively:")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p a"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("m"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" m "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'1'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" d "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" d "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("xrange")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n")])])]),s("p",[t._v("Note:")]),t._v(" "),s("p",[t._v("If any of your variable names coincide with the debugger commands, use an exclamation mark '"),s("strong",[t._v("!")]),t._v("' before the var to explicitly refer to the variable and not the debugger command. For example, often it might so happen that you use the variable name '"),s("strong",[t._v("c")]),t._v("' for a counter, and you might want to print it while in the debugger. a simple '"),s("strong",[t._v("c")]),t._v("' command would continue execution till the next breakpoint. Instead use '"),s("strong",[t._v("!c")]),t._v("' to print the value of the variable as follows:")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" !c\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"via-ipython-and-ipdb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#via-ipython-and-ipdb"}},[t._v("#")]),t._v(" Via IPython and ipdb")]),t._v(" "),s("p",[t._v("If "),s("a",{attrs:{href:"http://ipython.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("IPython"),s("OutboundLink")],1),t._v(" (or "),s("a",{attrs:{href:"http://jupyter.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jupyter"),s("OutboundLink")],1),t._v(") are installed, the debugger can be invoked using:")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ipdb\nipdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_trace"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("When reached, the code will exit and print:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('\n/home/usr/ook.py(3)()\n 1 import ipdb\n 2 ipdb.set_trace()\n----\x3e 3 print("Hello world!")\n\nipdb>\n\n')])])]),s("p",[t._v("Clearly, this means that one has to edit the code. There is a simpler way:")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" IPython"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("core "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ultratb\nsys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("excepthook "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ultratb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("FormattedTB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mode"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Verbose'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n color_scheme"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Linux'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n call_pdb"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("This will cause the debugger to be called if there is an uncaught exception raised.")]),t._v(" "),s("h2",{attrs:{id:"remote-debugger"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#remote-debugger"}},[t._v("#")]),t._v(" Remote debugger")]),t._v(" "),s("p",[t._v("Some times you need to debug python code which is executed by another process and and in this cases "),s("a",{attrs:{href:"https://github.com/tamentis/rpdb/",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("rpdb")]),s("OutboundLink")],1),t._v(" comes in handy.")]),t._v(" "),s("blockquote"),t._v(" "),s("p",[t._v("rpdb is a wrapper around pdb that re-routes stdin and stdout to a socket handler. By default it opens the debugger on port 4444")]),t._v(" "),s("p",[t._v("Usage:")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# In the Python file you want to debug.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" rpdb\nrpdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_trace"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("And then you need run this in terminal to connect to this process.")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Call in a terminal to see the output")]),t._v("\n$ nc "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".0")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v(".1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4444")]),t._v("\n\n")])])]),s("p",[t._v("And you will get pdb promt")]),t._v(" "),s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("home"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("usr"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("ook"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("py"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("module"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Pdb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])])])}),[],!1,null,null,null);a.default=e.exports}}]);