> ...event loop callbacks and spawned greenlets are excluded...
That helps! I can now handle spawned greenlets, but I'm still a little
unclear on the event loop callbacks. Is there an example you can point me
to?
> I'm not sure what do you mean by 'gevent frame'
Not sure if python uses the same terms, but I'm used to describing my
location with the terms thread, stack and frame. A thread is a path of
execution through the program (possibly simultaneous with other threads), a
stack describes the nested calls made by the thread, a frame is a single
layer on the stack (a function call, with associated local variables and
arguments).
The issue I was raising with "gevent frame" was that the coverage trace
function kept a representation of the stack and expected it to remain the
same. So if we are running coverage on a function with a blocking call in
the middle, the stack before and after that blocking call may look
different. After the blocking call, the stack starts with gevent's
Hub.switch() but before the blocking call the stack looked different -- the
trace function found a frame there that hadn't been there before the
blocking function.