[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#706243: libqtcore4: segfault in libQtCore.so.4.8.2 in QObject::thread (this=0x263d580) at kernel/qobject.cpp:1371



Am Samstag, den 27.04.2013, 09:46 -0300 schrieb Lisandro Damián Nicanor Pérez Meyer:
> On Sat 27 Apr 2013 04:14:28 Paul Menzel escribió:
> tag 706243 unreproducible
> thanks
> 
> > Am Freitag, den 26.04.2013, 21:53 -0300 schrieb Lisandro Damián Nicanor Pérez Meyer:
> > > tag 706243 moreinfo
> > > thanks
> [snip]
> > Sorry for forgetting that. The only German string I see, is the
> > following.
> > 
> >         #0  0x00007f7a6c03e594 in QObject::thread (this=0x263d580) at kernel/qobject.cpp:1371
> > 
> > The translations is »No such file or directory«, which just means, that
> > GDB did not find the source for `kernel/qobject.cpp`, which is indeed
> > not there as I do not have them installed. So the `list` command does
> > not work.
> 
> Hi Paul! I've installed hplip-gui, ran hp-systray and could not reproduce this 
> bug.

I think you need a device and scan something.

> I know you filled the bug from a different machine from the one you can 
> reproduce this issue. Can you run reportbug there and just add the list of 
> installed packages? (ie, no need to fill the bug again, I just need the info).

Sure. I am pasting it at the end of this message.

> What happens is you try adding a new user and run hp-systray from there?

I need to test that.

> Can you reproduce the issue in your i386 machine?

I have no device connected to that machine, but it seems to work.

> I'm CCing the hplip maintainers, because I'm not seeing this kind of crashes 
> anywhere else in Qt, so it might be an hplip issue.

I tried to debug this a little, but did not get very far.

        $ apt-get source libqtcore4
        $ cd qt4-x11-4.8.4+dfsg/src/corelib
        qt4-x11-4.8.4+dfsg/src/corelib$ LANG=C gdb python -c ~/20130426--hp-systray--libQtCore.so.4.8.2.core
        #0  0x00007f7a6c03e594 in QObject::thread (this=0x263d580) at kernel/qobject.cpp:1371
        1371    }
        (gdb) l
        1366        \sa moveToThread()
        1367    */
        1368    QThread *QObject::thread() const
        1369    {
        1370        return d_func()->threadData->thread;
        1371    }
        1372
        1373    /*!
        1374        Changes the thread affinity for this object and its children. The
        1375        object cannot be moved if it has a parent. Event processing will

So the not sure why it says 1371 and not 1370 where it actually has some
command line, which would make sense for a segmentation fault, if
`d_func()->threadData->thread` in invalid.

Looking at HPLIP code, it looks like this is related somehow to PyQt’s
SystemTray.

>     #10 0x00000000004c23d2 in frame_dealloc.14820 (f=
>         Frame 0x1e13910, for file /usr/share/hplip/ui4/systemtray.py, line 810, in run (i=0, notifier=<QSocketNotifier at remote 0x22e5b00>))
>         at ../Objects/frameobject.c:460
>             _py_tmp = <optimized out>
>             p = 0x1e13a90
>             valuestack = 0x1e13aa8
>             co = <optimized out>
>     #11 0x00000000004c2427 in frame_dealloc.14820 (f=
>         Frame 0x2673840, for file /usr/share/hplip/ui4/systemtray.py, line 748, in notifierActivated ()) at ../Objects/frameobject.c:468
>             p = <optimized out>
>             valuestack = <optimized out>
>             co = <optimized out>

No idea, why line 810 is after line 748 in this backtrace.

        $ nl -ba ui4/systemtray.py
        […]
           624	    def notifierActivated(self, s):
           625	        m = ''
           626	        while True:
           627	            try:
           628	                r, w, e = select.select([self.read_pipe], [], [self.read_pipe], 1.0)
           629	            except select.error:
           630	                log.debug("Error in select()")
           631	                break
           632	
           633	            if e:
           634	                log.error("Pipe error: %s" % e)
           635	                break
           636	
           637	            if r:
           638	                m = ''.join([m, os.read(self.read_pipe, self.fmt_size)])
           639	                while len(m) >= self.fmt_size:
           640	                    event = device.Event(*struct.unpack(self.fmt, m[:self.fmt_size]))
           641	
           642	                    m = m[self.fmt_size:]
           643	                    
           644	                    if event.event_code == EVENT_CUPS_QUEUES_CHANGED:
           645	                        self.resetDevice()
           646	                        for d in device.getSupportedCUPSDevices(back_end_filter=['hp', 'hpfax']):
           647	                            self.addDevice(d)
           648	                            
           649	                        self.setMenu()
           650	
           651	                    if event.event_code == EVENT_USER_CONFIGURATION_CHANGED:
           652	                        log.debug("Re-reading configuration (EVENT_USER_CONFIGURATION_CHANGED)")
           653	                        self.user_settings.load()
           654	                        self.user_settings.debug()
           655	
           656	                    elif event.event_code == EVENT_SYSTEMTRAY_EXIT:
           657	                        self.quit()
           658	                        return
           659	
           660	                    if self.user_settings.systray_visible in \
           661	                        (SYSTRAY_VISIBLE_SHOW_ALWAYS, SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE):
           662	
           663	                        log.debug("Showing...")
           664	                        self.tray_icon.setVisible(True)
           665	
           666	                        if event.event_code == EVENT_DEVICE_UPDATE_ACTIVE:
           667	                            if not self.active_icon:
           668	                                self.tray_icon.setIcon(self.prop_active_icon)
           669	                                self.active_icon = True
           670	                            continue
           671	
           672	                        elif event.event_code == EVENT_DEVICE_UPDATE_INACTIVE:
           673	                            if self.active_icon:
           674	                                self.tray_icon.setIcon(self.prop_icon)
           675	                                self.active_icon = False
           676	                            continue
           677	
           678	                        elif event.event_code == EVENT_DEVICE_UPDATE_BLIP:
           679	                            if not self.active_icon:
           680	                                self.tray_icon.setIcon(self.prop_active_icon)
           681	                                self.active_icon = True
           682	                                QTimer.singleShot(BLIP_DELAY, self.blipTimeout)
           683	                            continue
           684	
           685	                    if self.user_settings.systray_visible in (SYSTRAY_VISIBLE_HIDE_WHEN_INACTIVE, SYSTRAY_VISIBLE_HIDE_ALWAYS):
           686	                        log.debug("Waiting to hide...")
           687	                        QTimer.singleShot(HIDE_INACTIVE_DELAY, self.timeoutHideWhenInactive)
           688	
           689	                    if event.event_code <= EVENT_MAX_USER_EVENT:
           690	                        self.addDevice(event.device_uri)
           691	                        self.setMenu()
           692	
           693	                        if self.tray_icon.supportsMessages():
           694	
           695	                            log.debug("Tray icon message:")
           696	                            event.debug()
           697	
           698	                            error_state = STATUS_TO_ERROR_STATE_MAP.get(event.event_code, ERROR_STATE_CLEAR)
           699	                            desc = device.queryString(event.event_code)
           700	
           701	                            show_message = False
           702	                            if self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ALL: # OK, Busy
           703	                                show_message = True
           704	
           705	                            elif self.user_settings.systray_messages in (SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS, SYSTRAY_MESSAGES_SHOW_ERRORS_ONLY):
           706	                                if error_state == ERROR_STATE_ERROR:
           707	                                    show_message = True
           708	
           709	                                elif self.user_settings.systray_messages == SYSTRAY_MESSAGES_SHOW_ERRORS_AND_WARNINGS and \
           710	                                    error_state in (ERROR_STATE_WARNING, ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER):
           711	
           712	                                    show_message = True
           713	
           714	                            if event.printer_name:
           715	                                d = QString(event.printer_name)
           716	                            else:
           717	                                back_end, is_hp, bus, model, serial, dev_file, host, zc, port = \
           718	                                                device.parseDeviceURI(event.device_uri)
           719	
           720	                                if bus == 'usb':
           721	                                    idd = serial
           722	                                elif bus == 'net':
           723	                                    idd = host
           724	                                elif bus == 'par':
           725	                                    idd = dev_file
           726	                                else:
           727	                                    idd = 'unknown'
           728	
           729	                                self.model = models.normalizeModelUIName(model)
           730	
           731	                                if back_end == 'hp':
           732	                                    d = self.__tr("%1 Printer (%2)").arg(model).arg(idd)
           733	
           734	                                elif back_end == 'hpaio':
           735	                                    d = self.__tr("%1 Scanner (%2)").arg(model).arg(idd)
           736	
           737	                                elif back_end == 'hpfax':
           738	                                    d = self.__tr("%1 Fax (%2)").arg(model).arg(idd)
           739	
           740	                                else:
           741	                                    d = self.__tr("%1 (%2)").arg(model).arg(idd)
           742	
           743	                            if show_message:
           744	                                if have_pynotify and pynotify.init("hplip"): # Use libnotify/pynotify
           745	                                    icon, urgency = ERROR_STATE_TO_ICON_AND_URGENCY_PYNOTIFY.get(error_state,
           746	                                        (getPynotifyIcon('info'), pynotify.URGENCY_NORMAL))
           747	
           748	                                    if event.job_id and event.title:
           749	                                        msg = "%s\n%s: %s\n(%s/%s)" % (unicode(d), desc, event.title, event.username, event.job_id)
           750	                                        log.debug("Notify: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" %
           751	                                                (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code))
           752	                                    else:
           753	                                        msg = "%s\n%s (%s)" % (unicode(d), desc, event.event_code)
           754	                                        log.debug("Notify: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code))
           755	
           756	                                    n = pynotify.Notification("HPLIP Device Status", msg, icon)
           757	                                    n.set_urgency(urgency)
           758	
           759	                                    if error_state == ERROR_STATE_ERROR:
           760	                                        n.set_timeout(pynotify.EXPIRES_NEVER)
           761	                                    else:
           762	                                        n.set_timeout(TRAY_MESSAGE_DELAY)
           763	
           764	                                    n.show()
           765	
           766	                                else: # Use "standard" message bubbles
           767	                                    icon = ERROR_STATE_TO_ICON.get(error_state, QSystemTrayIcon.Information)
           768	                                    if event.job_id and event.title:
           769	                                        log.debug("Bubble: uri=%s desc=%s title=%s user=%s job_id=%d code=%d" %
           770	                                                (event.device_uri, desc, event.title, event.username, event.job_id, event.event_code))
           771	                                        self.tray_icon.showMessage(self.__tr("HPLIP Device Status"),
           772	                                            QString("%1\n%2: %3\n(%4/%5)").\
           773	                                            arg(d).\
           774	                                            arg(desc).arg(event.title).\
           775	                                            arg(event.username).arg(event.job_id),
           776	                                            icon, TRAY_MESSAGE_DELAY)
           777	
           778	                                    else:
           779	                                        log.debug("Bubble: uri=%s desc=%s code=%d" % (event.device_uri, desc, event.event_code))
           780	                                        self.tray_icon.showMessage(self.__tr("HPLIP Device Status"),
           781	                                            QString("%1\n%2 (%3)").arg(d).\
           782	                                            arg(desc).arg(event.event_code),
           783	                                            icon, TRAY_MESSAGE_DELAY)
           784	
           785	            else:
           786	                break
           787	
           788	
           789	    def blipTimeout(self):
           790	        if self.active_icon:
           791	            self.tray_icon.setIcon(self.prop_icon)
           792	            self.active_icon = False
           793	
           794	
           795	
           796	    def __tr(self, s, c=None):
           797	        return QApplication.translate("SystemTray", s, c, QApplication.UnicodeUTF8)
           798	
           799	
           800
           801	def run(read_pipe):
           802	    log.set_module("hp-systray(qt4)")
           803	    log.debug("PID=%d" % os.getpid())
           804	
           805	    app = SystemTrayApp(sys.argv, read_pipe)
           806	    app.setQuitOnLastWindowClosed(False) # If not set, settings dlg closes app
           807	
           808	    i = 0
           809	    while i < 60:
           810	        if QSystemTrayIcon.isSystemTrayAvailable():
           811	            break
           812	        time.sleep(1.0)
           813	        i += 1
           814	
           815	    if not QSystemTrayIcon.isSystemTrayAvailable():
           816	        FailureUI(None,
           817	            QApplication.translate("SystemTray",
           818	            "<b>No system tray detected on this system.</b><p>Unable to start, exiting.</p>",
           819	            None, QApplication.UnicodeUTF8),
           820	            QApplication.translate("SystemTray", "HPLIP Status Service",
           821	            None, QApplication.UnicodeUTF8))
           822	    else:
           823	        notifier = QSocketNotifier(read_pipe, QSocketNotifier.Read)
           824	        QObject.connect(notifier, SIGNAL("activated(int)"), app.notifierActivated)
           825	
           826	        app.exec_()

So, it probably is a HPLIP or PyQt issue. Though libqtcore4 should
probably not crash and somehow check that it can dereference some
pointer.


Thanks,

Paul


-- System Information:
Debian Release: 7.0
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages libqtcore4 depends on:
ii  libc6              2.13-38
ii  libgcc1            1:4.7.2-5
ii  libglib2.0-0       2.33.12+really2.32.4-5
ii  libstdc++6         4.7.2-5
ii  multiarch-support  2.13-38
ii  zlib1g             1:1.2.7.dfsg-13

libqtcore4 recommends no packages.

Versions of packages libqtcore4 suggests:
ii  libicu48  4.8.1.1-12
ii  libthai0  0.1.18-2

-- no debconf information

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: