Найти - Пользователи
Полная версия: Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault
Начало » GUI » Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault
1 2 3 4
py.user.next
Запусти программу в pdb. Можно и по-старинке: сделать вывод сообщений в консоль и запустить программу из консоли, чтобы понять, где происходит выпад.
Rodegast
А что за программа? Исходники предоставить можешь?
Vady
py.user.next
Запусти программу в pdb. Можно и по-старинке: сделать вывод сообщений в консоль и запустить программу из консоли, чтобы понять, где происходит выпад.
Вставил кучу принтов перед каждыми строчками. Установил, что сегфолтится постоянно в одном и том же месте:
 return QtGui.QApplication.notify(self, receiver, event)
Опубликую часть кода программы:
     def notify(self, receiver, event):
        try: 
            if self.eventLogFile and isinstance(event, QInputEvent): 
                self.recordEvent(receiver, event) 
            print '\nmain.py - 1-29_5'
            return QtGui.QApplication.notify(self, receiver, event) 
        except Exception, e: 
            if self.traceActive:
                self.logCurrentException() 
                widget = self.activeModalWidget()
                if widget is None:
                    widget = self.mainWindow
                QtGui.QMessageBox.critical( widget,
                                            u'Произошла ошибка',
                                            unicode(e),
                                            QtGui.QMessageBox.Close)
            return False
        except:
            return False
Что-то ошибки не нахожу. Дальше как дебажить программу? Вернее, строчку.

Rodegast
А что за программа? Исходники предоставить можешь?
Программа по сути - форк программы из сайта samson-rus.com. Сам форк, увы, не распространяется свободно… А исходник включает более 2000 файлов плюс столько же .pyc. Не думаю, что кто-нибудь возьмется изучить…
Протестировал сам самсон из этого сайта, строчки notify() те же, а сегфолта нет. Сверить исходники самсона с его форком, которому более 5 лет, бессмысленно - очень много отличий…
py.user.next
Vady
  
return QtGui.QApplication.notify(self, receiver, event)
Попробуй self убрать из списка аргументов.
Rodegast
Покажи то место откуда вызывается notify. Посмотри какие значения у receiver и event.
Vady
Rodegast
Покажи то место откуда вызывается notify. Посмотри какие значения у receiver и event.
Вот значения print(receiver) и print(event) до 5 сегфолтов:
 <PyQt4.QtGui.QScrollBar object at 0xace758e4>
________
<PyQt4.QtGui.QScrollBar object at 0xaa97a7c4>
<PyQt4.QtCore.QEvent object at 0xac7d9c8c>
__________
<PyQt4.QtGui.QScrollBar object at 0xad401344>
<PyQt4.QtCore.QEvent object at 0xac7cbbb4>
__________
<PyQt4.QtGui.QPushButton object at 0xaab1d464>
<PyQt4.QtCore.QEvent object at 0xaab76cd4>
__________
<PyQt4.QtGui.QWidget object at 0xaab82584>
<PyQt4.QtCore.QEvent object at 0xac8429bc>
То есть закономерностей от источников нет, то от QScrollBar, то от QPushButton, то QWidget. Если бы продолжил с эксперименты с сегфолтами, то вполне вероятно, что список Q-объектов будет продолжен…
Сегфолты с print(dir(receiver)) и print(dir(event)) позже предоставлю - очень долго логгировать до сегфолта, т.к. notify ежесекундно тысячи раз вызывается, консоль как будто бесконечно прорисовывает вывод.
Vady
После целого дня отладки с кодом нижеследующего вида дошел до сегфолта.
def notify(self, receiver, event):
try:
if self.eventLogFile and isinstance(event, QInputEvent):
self.recordEvent(receiver, event)
print ‘\nmain.py - 1-29_5’
print receiver
print(dir(receiver))
print event
print (dir(event))
return QtGui.QApplication.notify(self, receiver, event)
except Exception, e:
if self.traceActive:
self.logCurrentException()
widget = self.activeModalWidget()
if widget is None:
widget = self.mainWindow
QtGui.QMessageBox.critical( widget,
u'Произошла ошибка',
unicode(e),
QtGui.QMessageBox.Close)
return False
except:
return False
Вывод в консоль терминала получился очень-очень длинным из-за двух строчек, содержащих print(dir()). При попытке скопировать вывод для последующего сохранения в отдельный файл для более удобного анализа, терминал аварийно завершил работу… Повторить сегфолт - опять целый день “рыбалки”…
Единственное, что успел обратить внимание: до сегфолта последний вывод был на строчках:
print ‘\nmain.py - 1-29_5’
print receiver
То есть уже на строчке print(dir(receiver)) произошел сегфолт…
Может, это баг самого питона? А то всё грешил на Qt и PyQt…
py.user.next
Вот это делал? Какой результат?

Vady
Опубликую часть кода программы:
В каком классе этот метод notify() определён?
Vady
И, кстати, если весь этот переопределенный метод def notify… закомментировать, то сегфолты уже не замечаю, да и сама программа стала шустрее работать!
Склоняюсь к версии: вина лежит на самом питоне, который с памятью работает не безупречно…
py.user.next
Попробуй self убрать из списка аргументов.
Если убрать self из списка аргументов, то срабатывает exception:
Traceback (most recent call last):
File “program/main.py”, line 1166, in notify
self.logCurrentException()
File “program/main.py”, line 923, in logCurrentException
self.logException(*sys.exc_info())
File “program/main.py”, line 915, in logException
message = unicode(exceptionValue.message)
RuntimeError: maximum recursion depth exceeded while calling a Python object
py.user.next
Vady
Если убрать self из списка аргументов, то срабатывает exception:
Перед этой строкой с return выведи type(self) в консоль.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB