Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault [RSS Feed]

#1 Авг. 25, 2017 15:31:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

Запусти программу в pdb. Можно и по-старинке: сделать вывод сообщений в консоль и запустить программу из консоли, чтобы понять, где происходит выпад.



Отредактировано py.user.next (Авг. 25, 2017 15:31:47)

Офлайн

#2 Авг. 25, 2017 18:16:14

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2751
Репутация: +  184  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

А что за программа? Исходники предоставить можешь?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Авг. 29, 2017 23:09:40

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

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 лет, бессмысленно - очень много отличий…

Офлайн

#4 Авг. 30, 2017 18:10:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

Vady
  
return QtGui.QApplication.notify(self, receiver, event)
Попробуй self убрать из списка аргументов.



Офлайн

#5 Авг. 30, 2017 18:28:17

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2751
Репутация: +  184  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

Покажи то место откуда вызывается notify. Посмотри какие значения у receiver и event.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Авг. 30, 2017 22:11:02

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

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 (Авг. 30, 2017 22:11:29)

Офлайн

#7 Авг. 31, 2017 01:09:40

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

После целого дня отладки с кодом нижеследующего вида дошел до сегфолта.

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…

Офлайн

#8 Авг. 31, 2017 01:34:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

Вот это делал? Какой результат?

Vady
Опубликую часть кода программы:
В каком классе этот метод notify() определён?



Отредактировано py.user.next (Авг. 31, 2017 01:38:30)

Офлайн

#9 Авг. 31, 2017 01:37:29

Vady
Зарегистрирован: 2015-05-30
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

И, кстати, если весь этот переопределенный метод 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

Отредактировано Vady (Сен. 5, 2017 15:50:50)

Офлайн

#10 Авг. 31, 2017 01:40:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault

Vady
Если убрать self из списка аргументов, то срабатывает exception:
Перед этой строкой с return выведи type(self) в консоль.



Отредактировано py.user.next (Авг. 31, 2017 01:41:02)

Офлайн

  • Начало
  • » GUI
  • » Python 2.7.13 + QtGUI из комплекта Qt 4.8.6/4.8.7 в любых ОС = Segmentation Fault[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version