Search code examples
pythondebuggingjupyterpdbodoo.sh

Odoo.sh Editor on Jupyter : pdb.set_trace raises BdbQuit Error


Using my odoo.sh project (v13.0.2) > EDITOR-Tab , which redirects me to mywebsite.odoo.com/odoo-sh/editor/lab, when i want to debug using import pdb; pdb.set_trace(), it raises a BdbQuit Error :

  File "/usr/lib/python3.6/bdb.py", line 113, in 
  dispatch_exception
    if self.quitting: raise BdbQuit

In the past versions : v13.0.1.xxx, i could use pdb.set_trace() to debug my python code. How to solve this issue ?


Solution

  • rpdb is a remote debugger based on pdb. It re-routes stdin and stdout to a socket handler, so that you can debug server processes (remotely).

    In Odoo.sh > yourstagingBranch, click on the SHELL-tab:

    mywebsite-oerp-staging-5070461 [staging/v13.0]:~$ pip3 install rpdb
    

    In Odoo.sh > yourstagingBranch, click on the EDITOR-tab:

    IN ODOO-EDITOR:

    • At the top of your python file, add:
        import rpdb
    
    • In the function (def subscribe) to be inspected, add:
        def subscribe(self, event, **post):
            # code before
            rpdb.set_trace()
            # code after
    
    • Click on menu Tab : Odoo>Update current module : alternatively, open a new Terminal window and execute this command: odoo-bin -u website_sale --stop-after-init
        mywebsite-oerp-staging-5070461 [staging/v13.0]: odoo-bin -u website_sale --stop-after-init
    
    • After having restarted Odoo (all modules loaded), execute this command in the other Terminal window: nc 127.0.0.1 4444
        mywebsite-oerp-staging-5070461 [staging/v13.0]: ~$ nc 127.0.0.1 4444
    
    • We can then use the common pdb commands:

    l(ist): Lists the lines surrounding the current line

    w(here): Displays the file and line number where we currently are

    s(tep): Step into the function at the current line

    n(ext): Continue execution until the next line in the current function is reached or it returns. (The difference between next and step is that step stops inside a called function, while next executes called functions at (nearly) full speed, only stopping at the next line in the current function.)

    a(rgs): Print the argument list of the current function

    p(rint) variablename : Print value of variablename

    quit : To quit rPdb

    More info : https://itnext.io/debugging-your-code-in-python-pdb-vs-rpdb-e7bb918a8ac3 Official documentation (commands) : https://docs.python.org/3/library/pdb.html

    #######

    OR, alternatively : Using this post How to debug python CLI that takes stdin? :

    1. in Odoo.sh>EDITOR (Jupyter Lab): Open a first Terminal and create these two fifos which will be used as stdin/stdout to use pdb :

       mkfifo fifo_stdin
      
       mkfifo fifo_stdout
      
       cat fifo_stdout & cat > fifo_stdin
      

    ...which makes appear a prompt cursor. Keep this Terminal Tab opened.

    1. Write these 2 lines at the top of the Python script to be debugged :

       import pdb
       mypdb=pdb.Pdb(stdin=open('fifo_stdin','r'), stdout=open('fifo_stdout','w'))
      
    2. In this Python script, call set_trace() on your customized mypdb:

      def _get_total_amount(self):     
         total_amount = sum(self._get_base_order_lines(program).mapped('price_total')) 
         mypdb.set_trace()  
         return total_amount
      

    ...