[webkit-dev] Easing printf based debugging in WebKit with an helper.

Maciej Stachowiak mjs at apple.com
Thu Jul 19 14:27:49 PDT 2012


On Jul 10, 2012, at 8:52 AM, Brady Eidson <beidson at apple.com> wrote:

> 
> On Jul 10, 2012, at 5:25 AM, Alexis Menard <alexis.menard at openbossa.org> wrote:
> 
>> On Mon, Jul 9, 2012 at 6:53 PM, Brady Eidson <beidson at apple.com> wrote:
>>> 
>>> On Jul 9, 2012, at 2:43 PM, Alexis Menard <alexis.menard at openbossa.org> wrote:
>>> 
>>>> Hi,
>>>> 
>>>> For those who "secretly" use printf debugging :). I know the
>>>> recommended way is to use a debugger and it's not the point of this
>>>> discussion.
>>> 
>>> A lot of us do this, and sometimes it's necessary.  I agree with the gripe and support adding something easier.
>>> 
>>>> So I propose wtf() and its stream operator.
>>>> 
>>>> Usage :
>>>> 
>>>> wtf()<<"Hello"<<"World"<<3<<4.53322323; will output : Hello World 3 4.53322
>>> 
>>> There is no reason to bring in stream operators - that are willfully absent from WebCore - just for debugging.
>>> 
>> 
>> But it's really nice for that purpose, and somehow match std::cout
> 
> And we quite purposefully don't use std::cout in the project.
> 
>>> Overloading functions works just as well.
>> 
>> I'm not sure to understand what you mean here…
> 
> I mean relying on C++'s overloading of functions for the different types you'd like to printf debug.
> 
> void debug(WebCore::String&);
> void debug(WebCore::Frame*);
> void debug(WebCore::Node*);
> 
> etc etc etc.
> 
> debug(someFrame);
> debug(someNode);
> debug(someString);
> 
> Especially that last one would help me from remembering how to type "printf("%s", someString.utf8().data())" which is all I've ever really wanted.

In principle, we could also have this support multiple arguments, so you could write:

debug("frame: ", someFrame, " node: ", someNode, " string", someString);

This would be no more verbose than the << style, but could compile to a single function call at the call site and therefore could be relatively compact. I would find this easier to deal with than a unary function or a printf-style format string. The way you'd do this is by defining template functions which call a unary overloaded function for each argument:

template<typename A, typename B> debug(A a, B b)
{
    debug(a);
    debug(b);
}

template<typename A, typename B, typename C> debug(A a, B b, C c)
{
    debug(a);
    debug(b);
    debug(c);
}

template<typename A, typename B, typename C, typename D> debug(A a, B b, C c, D d)
{
    debug(a);
    debug(b);
    debug(c);
    debug(d);
}

... and so on up to some reasonable number of arguments.

Regards,
Maciej








More information about the webkit-dev mailing list