trace options

Terry Reedy tjreedy at udel.edu
Thu Jun 25 16:08:24 EDT 2009


Edward Peschko wrote:
> All,
> 
> I've been looking at the trace module, and although it looks useful, I'm
> surprised that there aren't a couple of features that I would have thought
> would be fairly basic. So, does trace support (for the --trace option):

I have never used the trace module but decided to try it out, following 
the simple example in the docs with a simple function. It seems a bit 
underdocumented, so I presume help with that would be welcome. I also 
found deficiencies in the operation, though different from you.

>    - indentation tracking stacklevel (where each function is prefixed
>      by tabs equal to the number of stacklevels deep in the program)

Trace already does one space indents for modules after the first

  --- modulename: threading, funcname: settrace
   --- modulename: compare, funcname: lt_iw

and lines after the first

compare.py(47):     while m != 0 and n != 0:
  compare.py(48):         m, n = m-1, n-1

That would have to be eliminated, at least when stack indents were on.
Tabs are nasty when interpreted as 8 chars. If added, the user should 
specify the indent: indent = '  ', for instance, for 2 space indents.

>    - output to something other than sys.stdout (eg. output to a file
>      specified either by environmental variable or by parameter).

That seems reasonable.  It also seems reasonable that I be able to write 
counts *to* stdout (the screen) when running interactive. But
when I changed
   r.write_results(show_missing=True, coverdir="/tmp")
in the doc example to just
   r.write_results()
I got nothing, rather than the line-by-line count I expected.  A bug?

On the other hand,
   r.write_results(summary=True)
did give output - the coverage for the module, which was not helpful.
This was so with both run('func(args)') and runfunc(func, args)
Coverage should be by function, I think, especially with runfunc.

>    - mult-threaded programs going to multiple output handles,
>      especially in light of the above
> 
>    - fully qualified python modules in path: (eg:
> 
>          /path/to/module/my_module.py(1): print "HERE"
> 
>      instead of
> 
>        my_module.py(1): print "HERE".

I think a full name in the modulename line would be good, but full names 
in the trace lines would be awful.  In fact, I would prefer no name, 
and, especially when using runfunc, line numbers relative to the 
function rather than the module. Also remove the silly indent. So I 
would like

  --- modulename: compare, funcname: lt_iw
compare.py(47):     while m != 0 and n != 0:
  compare.py(48):         m, n = m-1, n-1

changed to

Modulename: path/compare, funcname: lt_iw
   1:     while m != 0 and n != 0:
   2:         m, n = m-1, n-1

> Ultimately, I'd like to be able to look at two runs of a program
> and be able to pinpoint the very first difference
> between thembased on the output of their trace runs. As it
> stands, I really can't do this.

When I trace a function mentally, to write or debug, I keep track of the 
values of the local names.  Perhaps trace was not meant for this. 
However, if I were modifying trace, the first thing I would add would be 
the ability to print variable values with each line executed.

> Of course I could implement the above, but I was
> hoping to avoid duplicated effort if someone has
> already implemented options like this..I posted the above to
> the python-dev list, they suggested I take it here, so any help
> would be appreciated.

I searched http://pypi.python.org/pypi for 'trace' and did not see 
anything obvious.  If you do modify trace and your changes are not 
immediately accepted, you could list your version on PyPI.  In fact, 
that might be the best way to get them in.  Of course, one problem you 
can see from the above is that different people will have different 
ideas on what constitutes 'better' ;-).

Terry Jan Reedy




More information about the Python-list mailing list