Wednesday, June 7, 2006
How do i tell totalview to stop at a line number in a particular file? This is a C++ function in a SO which is being loaded as part of a python import.
Leaf Nunes has the most awesome answer:
Leaf Nunes has the most awesome answer:
I 'm not sure how you tell totalview via totalview, but you can tell the C++ to stop at a line by adding:Arun Rao:
asm("int $3");This is the only way i've seen to pre-set a breakpoint in C code referenced by a python binary running under totalview. Once it's stopped, you should be able to look around all the libraries the python binary has loaded and set breakpoints as you desire.
If you run the python program until it finishes, then you can set the breakpoint because the library will have been loaded, and restart the process.
I asked about introspecting python variables. I was looking for something similar to Tcl's upvar command. I received a couple of good responses. I didn't ever end up using them for debugging, but I sure learned a lot more about Python introspection than I knew previously.
We have to remember that an arbitrary number of variables, all with different names, can refer to the same object. For example,
foo = 'something'
bar = foo
Now suppose I say, printvars('message', bar). The printvars function will get a reference to the 'something' string, but it doesn't know that the name of the reference I called you with was 'bar' rather than 'foo'. This function will take your argument, and look through globals() and find all the names that refer to that object, and then print those out, but this is almost certainly slow, fragile and useless:
def printvars(msg, *args): print msg, ':', for arg in args: matches =  for name, val in globals().items(): if arg is val: matches.append(name) for match in matches: print match+',', print '=', repr(arg)+';', print ''
If I use this as with my hypothetical example above, it produces this output:Erick Tryzelaar:
>>> printvars('message', bar) message : bar, foo, = 'something'
This is doable with scary python black magic:Lars Damerow:
import sys def foo(msg, *args): caller = sys._getframe(1) print msg, ' '.join(['%s=%s' % (x, caller.f_locals[x]) for x in args]) x = 5 y = 6 foo('hello', 'x', 'y') hello x=5 y=6
I agree with Erick and Alex here -- you can't get away from passing the variable names in as strings, since Python just considers variable names to be string keys for the local and global scope dictionaries. I also second Erick's opinion that using sys._getframe is not a good idea. It may look redundant, but the simplest and most bulletproof approach is probably something like this:Jim Atkinson:
def printvars(msg, *args): print msg, ' '.join(['%s=%s' % (x, v) for (x, v) in args]) >>> x = 1 >>> y = 2 >>> printvars("hello", ("x", x), ("y", y)) hello x=1 y=2We could make that a lot cleaner if Python had macros, but it doesn't. If we knew that all of the desired variables are in the same dictionary (which includes locals() and globals()), we could obviously clean up the calls like this:
def printvars(msg, scope, *args): print msg, ' '.join(['%s=%s' % (x, scope[x]) for x in args]) >>> x = 1 >>> y = 2 >>> printvars("hello", locals(), "x", "y") hello x=1 y=2
Although you cannot avoid giving the name as well as the value for the variable. You can use keyword syntax to pass them and avoid having to type quotes around the name.
def printvars(msg, **kw): print msg, keys = kw.keys() keys.sort() for key in keys: print "%s=%r", (key, kw[key]) print x = 1 y = 2 printvars ("hello", x=x, y=y) hello x=1 y=2The only downside is that you cannot control the order of the variables, it is always alphabetical.
A while back I answered a question on Stack Overflow asking about the relative popularity of TAOCP. I replied with something I had heard, th...
Using Go at The New York Times Twelve Go Best Practices - Francesc Campoy Google I/O 2013 - Fireside Chat with the Go Team Origins of ...
There's a lot of notes written for getting Vim + Go up and running, but a lot of the notes assume you're already in modern Vim-land....