[Kde-perl] Suspicious QWidget Initialization Behaviour

Gary Greene greeneg at tolharadys.net
Tue Aug 11 05:47:13 CEST 2009


On Monday 10 August 2009 8:10:11 pm Jonathan Yu wrote:
> Hi Chris:
> 
> I'm not sure where this is happening, or perhaps if it's just a usage
> error. I'm creating a new object of a class that inherits from
> Qt::Widget. I've noticed if I do [the equivalent of]:
> Qt::Widget->new();
> 
> Then I get a core dump with the following backtrace:
> 
> #0  QWidget::sizePolicy (this=0x0) at kernel/qwidget.cpp:8925
> 8925	kernel/qwidget.cpp: No such file or directory.
> 	in kernel/qwidget.cpp
> (gdb) bt full
> #0  QWidget::sizePolicy (this=0x0) at kernel/qwidget.cpp:8925
> No locals.
> #1  0xb7a6a938 in xcall_QWidget (xi=<value optimized out>, obj=0x0,
>     args=0x9bb7d08) at /home/jon/kdebindings/build/smoke/qt/x_20.cpp:4820
> No locals.
> #2  0xb7bd5153 in PerlQt::MethodCall::callMethod (this=0xbf9b1860)
>     at src/marshall_types.h:132
> 	method = (Smoke::Method *) 0xb7b2feac
> 	fn = (void (*)(short int, void *,
>     Smoke::StackItem *)) 0xb7a69c40 <xcall_QWidget(short, void*,
> Smoke::StackItem*)>
> 	ptr = (void *) 0x0
> 	callreturn = {<PerlQt::MethodReturnValueBase> = {<Marshall> = {
>       _vptr.Marshall = 0xbf9b1668}, _smoke = 0x80abc27, _methodIndex =
>  -31492, _stack = 0x8f98548, _retval = 0xb7f32ff4}, <No data fields>}
> #3  0xb7bd1f38 in PerlQt::MethodCallBase::next (this=0xbf9b1860)
>     at src/marshall_types.cpp:387
> 	oldcur = -1
> #4  0xb7bc803c in XS_AUTOLOAD (my_perl=0x8f98008, cv=0x99da9d8)
>     at src/util.cpp:1223
> 	classId = 5364
> 	methodId = <value optimized out>
> 	rcid = <value optimized out>
> 
> It looks like a void pointer (ptr) is being passed to the sizePolicy,
> and I'm not sure if this is a Qt bug or a PerlQt bug. Either way it's
> due to improper checking of parameters -- ie maybe trying to
> dereference the null pointer.
> 
> Thanks in advance for any help you can offer here.
> 
> On an unrelated note, I've discovered while debugging code that
> "Carp::Always" is a very useful module. It makes calls to "die" dump a
> full backtrace, meaning the issues with ambiguous methods croak'ing
> from XS will dump a full backtrace. It's tremendously useful for
> debugging.
> 
> Cheers,
> 
> Jonathan
> _______________________________________________
> Kde-perl mailing list
> Kde-perl at kde.org
> https://mail.kde.org/mailman/listinfo/kde-perl
> 

Dunno if this still works in PerlQt4, did in 3....
Another useful aspect is doing the following:

use Qt::debug qw| CHANNEL |;

Where CHANNEL is one of:

ambiguous, verbose, calls, autoload, gc, virtual, all

These were all described in the POD for PerlQt3. As I said, I don't know if 
they still work in PerlQt4.


More information about the Kde-perl mailing list