[Development] Tracing Qt

André Pönitz andre.poenitz at mathematik.tu-chemnitz.de
Sat Aug 24 00:11:26 CEST 2013


On Fri, Aug 23, 2013 at 12:30:09PM +0000, Rutledge Shawn wrote:
> 
> On 23 Aug 2013, at 1:20 PM, Robin Burchell wrote:
> > Thoughts, flames, cookies?
> 
> Yes I've been interested in doing something like that too, for debugging
> touch and other types of events.  The biggest problem with events is that
> they get converted into different types and queued multiple times, which
> is both inefficient and hard to debug.  My goal is to be able to trace an
> OS touch event all the way through to the QtQuick item which handles the
> QtQuick-specific form of the event.  So I think this is (yet another?)
> high-priority thing to get done; and I don't think it's hard, we just
> need to agree whether it's OK to "clutter" the code with these trace
> lines.  And to avoid performance impact we need to be sure that in
> non-debug builds, the code disappears completely.  I think that means the
> trace lines should use a macro, so that the macro can be #defined to a
> no-op for non-debug builds.  The trace lines should be one-liners so we
> don't have #ifdef/endif clutter around all of them, but they should
> generate no machine code whatsoever when Qt is compiled in no n-debug
> mode.  Otherwise it would become hopeless to use it in
> performance-critical code.

To my understanding so far it is an explicit goal to be able to
use the tracers also in release builds, also within performance
critical code.

> As an example, if you want a DEBUG macro which expands to printf, you
> will need a varargs version of the macro to use when you want to compile
> without debug support.  e.g.  #define DEBUG(format, args...) ((void)0)
> And varargs macros are not supported by all compilers.  But a macro which
> takes a fixed number of args is easy to turn into a no-op.
> 
> There are alternatives.  One could write a script or some other type of
> tool which can insert the trace lines into your source tree whenever you
> want to do some tracing, so that the source code clutter is there only
> when you want it.

I don't think we are talking about the same thing right now.

> [...]
> Tracing certain function entry/exit points would also be enough some of
> the time for some use cases, but not all the time (e.g. when we are only
> interested in certain branches of a switch). 

The idea is to be flexible on what parts are traced, and what the tracer
can do. It is understood that for quite a couple of cases there are
solutions, either the ad-hoc bits that are in the code already, or by
using external tools.

> If it were enough, then it would be possible to write something like a
> debugger which automatically creates a gazillion breakpoints, and each
> time it hits one, it logs the fact and automatically continues. 

This fails to meet the performance constraints. Assuming we are talking
about something like gdb, Hitting a "normal" breakpoint and deciding to
continue takes several milliseconds as minimum. The proposed solution here
is a stack guard object checking a global flag first, i.e. a handful of
instructions in the no-trace case. There are a few orders of magnitude on
performance impact between these two approaches.

> Then the Qt source wouldn't require
> modifications, only the same debug symbols that gdb etc. already use.
> This sort of thing has been done before too (but I'd have to google again
> to find those projects again).

Maybe you are thinking of http://sourceware.org/gdb/onlinedocs/gdb/Tracepoints.html
which addresses at least the performance problem. It is, however, pretty
limited in what kind of operation it can (easily) trigger, and need quite
a bit of handholding to set up.

> If the trace clutter bothers people, they could be kept in separate
> patches which are maintained so that they can always be applied
> on-demand.  But then the danger is code rot in those patches.  It would
> be less trouble if the patch tool was more intelligent, based on
> recognizing similar-looking code instead of a line-by-line diff.  But
> then it's more like a script to add the traces rather than just a patch.

Are you sure we are already discussing real problems or are we inventing
some? I don't think _one line_ per "interesting" function will turn out
to be a problem justifying extra build steps
 
> Either way it would tend to need autotests to keep it working.
> 
> Whatever we do might benefit from sharing some of the QDebug/QWarning
> related code instead of starting over from scratch.  And those are not as
> flexible as they could be, either.  At one previous commercial job we had
> a custom log function which underneath was QDebug with a category field
> added to each line, and then there was a GUI window for viewing and
> filtering the debugs in real-time as the software emitted them.  That
> sort of thing could be built in to Qt, too.  At some point tracing and
> logging could be essentially the same thing, if we design it that way.

Right, but I doubt that's easy to do that under the usual compatibility
constraints. 
 
> So it's kindof a tricky problem, but I hope we can at least agree on some
> useful framework for the near term.

Maybe the way to go is to simply create a patch and discuss that on
gerrit then. 

Andre'



More information about the Development mailing list