[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