[webkit-dev] Easing printf based debugging in WebKit with an helper.
Balazs Kelemen
kbalazs at webkit.org
Thu Jul 19 14:58:13 PDT 2012
On 07/19/2012 11:27 PM, Maciej Stachowiak wrote:
> 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.
But neither these compile to a single function call. Or we could define
simple inline debug() overrides but we could also do that with the
stream operator. And anyway, if the actual calls are not supposed to
land than it doesn't matter how compact it is. For me the stream
operator is a bit nicer.
-kbalazs
More information about the webkit-dev
mailing list