Verbose to super verbose python trace debugging

Written by John Benson on .

Sometimes, verbose just isn't enough. There are a couple options:

1st level:

In your nuke home dir (assuming you haven't changed it, ~/.nuke on OSX and Linux - I don't know Windows), add or modify the init.py file by adding the line:

import callbacksTrace

This prints out every callback nuke makes. There are a lot of them!

 

2nd level (super verbose):

If you want to get tons more information that you'll probably ever need, but might just help you find or discover that one stupid thing that's been breaking everything, you can use this code to turn things up a notch:

In code below, in the doc section of traceit(), there are some env variables you can add before you launch nuke. Any one of these will do:

    setenv NUKE_TRACE_DEBUG call
setenv NUKE_TRACE_DEBUG line
setenv NUKE_TRACE_DEBUG return
setenv NUKE_TRACE_DEBUG exception
setenv NUKE_TRACE_DEBUG c_call
setenv NUKE_TRACE_DEBUG c_return
setenv NUKE_TRACE_DEBUG c_exception

Depending on what you set NUKE_TRACE_DEBUG to, python will return different amounts of information from the actual line of code to the call made, the return, or any exceptions.

 

To make all this debug relevant to Nuke, I've added the line: 

        if 'nuke' in name.lower():

to only capture nuke related processes. SInce all the code in our studio is in a package with "nuke" also in the package name, the trace also prints our internal python. Add or modify the 'if' at that stage to allow it to return more relevant information at your facility. It's waaaay too verbose otherwise, telling you every raw python call your code accesses.

To turn it back off, remove the env variable with 

unsetenv NUKE_TRACE_DEBUG

 

import os, sys

def
traceit(frame, event, arg):

"""
used by sys.settrace() to provide trace dumps for python apps
from Andrew Dalke's blog at http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html
Modified to only return 'nuke' specific code, else all things python would be spit out.
This env var NUKE_TRACE_DEBUG can take on the values defined in
http://docs.python.org/lib/debugger-hooks.html, ie:
'call', 'line', 'return', 'exception', 'c_call', 'c_return' and 'c_exception'.
Copy one of the below lines and paste into the shell you are launching nuke from:
 setenv NUKE_TRACE_DEBUG call
setenv NUKE_TRACE_DEBUG line
setenv NUKE_TRACE_DEBUG return
setenv NUKE_TRACE_DEBUG exception
setenv NUKE_TRACE_DEBUG c_call
setenv NUKE_TRACE_DEBUG c_return
setenv NUKE_TRACE_DEBUG c_exception
unsetenv NUKE_TRACE_DEBUG # to stop printing
"""

if event == os.environ['NUKE_TRACE_DEBUG']:
lineno = frame.f_lineno
filename = ''
if frame.f_globals.has_key("__file__"):
filename = frame.f_globals["__file__"]
if (filename.endswith(".pyc") or
filename.endswith(".pyo")):
filename = filename[:-1]
name = frame.f_globals["__name__"]
line = linecache.getline(filename, lineno)
if 'nuke' in name.lower():
sys.stderr.write("%s:%s: %s\n" % (name, lineno, line.rstrip()))
sys.stderr.flush()
return traceit
 
 
if os.environ.has_key('NUKE_TRACE_DEBUG'):
import linecache
if os.environ['NUKE_TRACE_DEBUG'] == '':
os.environ['NUKE_TRACE_DEBUG'] = 'call'
sys.settrace(traceit)
 

Comments   

 
# Aurelyen Daudet 2011-05-02 08:19
interesting ! thanks for the tip and examples.
 
 
# Howard Jones 2011-07-17 16:56
Very useful - I had to add import os, sys for this to work though - should I have?
Howard
 
 
# John Benson 2011-07-18 00:49
whoops - you are right - I extracted that bit from a larger utility module which already had the imports. I just added the imports to the above code.
 

You have no rights to post comments

We have 3251 guests and 104 members online