Форум сайта python.su
Запусти программу в pdb. Можно и по-старинке: сделать вывод сообщений в консоль и запустить программу из консоли, чтобы понять, где происходит выпад.
Отредактировано py.user.next (Авг. 25, 2017 15:31:47)
Офлайн
А что за программа? Исходники предоставить можешь?
Офлайн
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. Не думаю, что кто-нибудь возьмется изучить…
А что за программа? Исходники предоставить можешь?
Офлайн
VadyПопробуй self убрать из списка аргументов.return QtGui.QApplication.notify(self, receiver, event)
Офлайн
Покажи то место откуда вызывается notify. Посмотри какие значения у receiver и event.
Офлайн
RodegastВот значения print(receiver) и print(event) до 5 сегфолтов:
Покажи то место откуда вызывается notify. Посмотри какие значения у receiver и event.
<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>
Отредактировано Vady (Авг. 30, 2017 22:11:29)
Офлайн
После целого дня отладки с кодом нижеследующего вида дошел до сегфолта.
def notify(self, receiver, event):Вывод в консоль терминала получился очень-очень длинным из-за двух строчек, содержащих print(dir()). При попытке скопировать вывод для последующего сохранения в отдельный файл для более удобного анализа, терминал аварийно завершил работу… Повторить сегфолт - опять целый день “рыбалки”…
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 ‘\nmain.py - 1-29_5’То есть уже на строчке print(dir(receiver)) произошел сегфолт…
print receiver
Офлайн
Вот это делал? Какой результат?
VadyВ каком классе этот метод notify() определён?
Опубликую часть кода программы:
Отредактировано py.user.next (Авг. 31, 2017 01:38:30)
Офлайн
И, кстати, если весь этот переопределенный метод def notify… закомментировать, то сегфолты уже не замечаю, да и сама программа стала шустрее работать!
Склоняюсь к версии: вина лежит на самом питоне, который с памятью работает не безупречно…
py.user.nextЕсли убрать self из списка аргументов, то срабатывает exception:
Попробуй self убрать из списка аргументов.
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)
Офлайн
VadyПеред этой строкой с return выведи type(self) в консоль.
Если убрать self из списка аргументов, то срабатывает exception:
Отредактировано py.user.next (Авг. 31, 2017 01:41:02)
Офлайн