Hello,

A  little  over a  year  ago  I  reported[1]  that qcad  started  having
segfaults in 7.0  (or 7.1). I thought  I would try to debug  it today in
7.4 and  so enabled DEBUG_PACKAGES  and DEBUG variables in  the cad/qcad
Makefile  and also  the x11/qt5/qtscript  Makefile hoping  to debug  the
segfault. In the Makefile for both I set:

DEBUG_PACKAGES=                 ${BUILD_PACKAGES}
DEBUG=                          -O0 -g

Then I built  the packages, installed them and their  debug packages and
hoped to capture  a segfault, but it doesn't  crash. Apparently enabling
-O0 in qtscript's Makefile makes it  not crash. To test that hypothesis,
I commented out the DEBUG line completely and rebuilt qtscript with just
the  defaults  that  DEBUG_PACKAGES  inherits  and  sure  enough,  after
installing that qtscript package built with -O2 qcad again crashes.

(gdb) bt
#0  0x000003eae2f9a990 in QScriptEnginePrivate::mark (this=0x3eb4af54a80, 
markStack=...) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/script/api/qscriptengine.cpp:1320
#1  0x000003eae2f14d6c in QTJSC::Heap::markRoots (this=0x3ea8c2129e8) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp:1167
#2  0x000003eae2f13ac5 in QTJSC::Heap::reset (this=0x3ea8c2129e8) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp:1269
#3  QTJSC::Heap::allocate (this=0x3ea8c2129e8, s=<optimized out>) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp:405
#4  0x000003eae2fa3ac2 in QTJSC::JSCell::operator new (size=56, exec=<optimized 
out>) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSCell.h:167
#5  QScriptEnginePrivate::newVariant (this=0x3eb4af54a80, value=...) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/script/api/qscriptengine.cpp:1797
#6  0x000003eae2fa51b5 in QScriptEngine::newVariant (this=<optimized out>, 
value=...) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/script/api/qscriptengine.cpp:2233
#7  0x000003eade54f63f in qtscript_create_Qt_Axis_class (engine=0x3eaf5f91770, 
clazz=...) at ../../generated_cpp/com_trolltech_qt_core/qtscript_Qt.cpp:4157
#8  0x000003eade5445ee in qtscript_create_Qt_class (engine=0x3eaf5f91770) at 
../../generated_cpp/com_trolltech_qt_core/qtscript_Qt.cpp:8386
#9  0x000003eade62a327 in qtscript_initialize_com_trolltech_qt_core_bindings 
(extensionObject=...) at 
../../generated_cpp/com_trolltech_qt_core/com_trolltech_qt_core_init.cpp:312
#10 0x000003eade3a1d9e in com_trolltech_qt_core_ScriptPlugin::initialize 
(this=0x3eabb1f6100, key=..., engine=0x3eaf5f91770) at plugin.cpp:21
#11 0x000003eae2fabdf9 in QScriptEngine::importExtension (this=0x3eaf5f91770, 
extension=...) at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/script/api/qscriptengine.cpp:3769
#12 0x000003ea8abc35ab in RScriptHandlerEcma::RScriptHandlerEcma 
(this=0x3eabb1e94e0) at RScriptHandlerEcma.cpp:434
#13 0x000003ea8abd4919 in RScriptHandlerEcma::factory () at 
RScriptHandlerEcma.cpp:1074
#14 0x000003ead8eb2c3e in RScriptHandlerRegistry::createScriptHandler 
(extension=...) at RScriptHandlerRegistry.cpp:67
#15 0x000003ead8eb2caf in RScriptHandlerRegistry::getGlobalScriptHandler 
(extension=...) at RScriptHandlerRegistry.cpp:76
#16 0x000003e87ec05021 in main (argc=1, argv=0x7b524ae78618) at main.cpp:389
(gdb) list
1315        }
1316    
1317        if (q) {
1318            QScriptContext *context = q->currentContext();
1319    
1320            while (context) {
1321                JSC::ScopeChainNode *node = 
frameForContext(context)->scopeChain();
1322                JSC::ScopeChainIterator it(node);
1323                for (it = node->begin(); it != node->end(); ++it) {
1324                    JSC::JSObject *object = *it;

Stepping through with -O2, it seems to go through one or two iterations of a 
while loop and then crashes:

(gdb) print context
$8 = (QScriptContext *) 0xf0800cd3288
(gdb) print *context
$9 = {d_ptr = 0x100000000}
(gdb) next
1323                for (it = node->begin(); it != node->end(); ++it) {
(gdb) 
1324                    JSC::JSObject *object = *it;
(gdb) 
1325                    if (object)
(gdb) 
1326                        markStack.append(object);
(gdb) 
1323                for (it = node->begin(); it != node->end(); ++it) {
(gdb) 
1329                context = context->parentContext();
(gdb) 
1320            while (context) {
(gdb) print context
$10 = (QScriptContext *) 0x1
(gdb) next

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00000f07f754b990 in QScriptEnginePrivate::mark (this=0xf079205c480, 
    markStack=...)
    at 
/usr/ports/pobj/qtscript-5.15.10/qtscript-everywhere-src-5.15.10/src/script/api/qscriptengine.cpp:1320
1320            while (context) {
(gdb) print context
$11 = (QScriptContext *) 0x1

When I run it compiled with -O0 the value of that context pointer is 0x0
at  this same  moment  in  execution. Is  0x1  something  unique to  the
compiler that is trying to protect against bad code?

Is there other useful information that I can try to obtain to figure out
why it's crashing  or what it's doing wrong? Is  this perhaps a question
for the QCad community?

Thanks,

Andy

[1] https://marc.info/?l=openbsd-misc&m=166019212130315&w=2

Reply via email to