Уведомления

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

#1 Авг. 31, 2017 01:48:27

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
В каком классе этот метод notify() определён?
 class CS11mainApp(QtGui.QApplication):
py.user.next
Перед этой строкой с return выведи type(self) в консоль.
 <class '__main__.CS11mainApp'>

Офлайн

#2 Авг. 31, 2017 01:54:37

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

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

Вставь отдельный print в except часть (в каждой except части должен быть свой print). Посмотри, не входит ли оно в except перед падением.



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

Офлайн

#3 Авг. 31, 2017 09:01:19

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
Вставь отдельный print в except часть (в каждой except части должен быть свой print). Посмотри, не входит ли оно в except перед падением.
Вставил, в except перед падением не входит.

Офлайн

#4 Авг. 31, 2017 10:51:12

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

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

То есть уже на строчке print(dir(receiver)) произошел сегфолт…
Может, это баг самого питона? А то всё грешил на Qt и PyQt…

Это не баг python-а, а то о чём я думал. receiver это питоновская обёртка над объектом Qt-а. При некоторых ошибках может получиться так что Qt-объект удалён, а receiver ещё жива. В это случае при любом обращении к receiver происходит ошибка сегментирования.
https://habrahabr.ru/post/210304/



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

Офлайн

#5 Авг. 31, 2017 10:58:43

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

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

Rodegast
Это не баг python-а, а то о чём я думал. receiver это питоновская обёртка над объектом Qt-а. При некоторых ошибках может получиться так что Qt-объект удалён, а receiver ещё жива. В это случае при любом обращении к receiver происходит ошибка сегментирования.
https://habrahabr.ru/post/210304/
Спасибо! Осталось искать где именно косяк в коде… receiver может ли как-то подсказать?

Офлайн

#6 Авг. 31, 2017 14:28:11

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

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

receiver тебе ничем не поможет. Посмотри с каким сигналом он приходит, а потом просмотри все emit-ы которые этот сигнал генерируют. Наверняка в каком-то из них касяк.



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

Офлайн

#7 Сен. 1, 2017 09:03:58

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

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

Vady
И, кстати, если весь этот переопределенный метод def notify… закомментировать, то сегфолты уже не замечаю, да и сама программа стала шустрее работать!
Поправлю: даже с закомментированным переопределенным методом сегфолты все-таки происходят, если с программой работать намного дольше. Действительно, источник надо искать в другом месте…
Rodegast
receiver тебе ничем не поможет. Посмотри с каким сигналом он приходит, а потом просмотри все emit-ы которые этот сигнал генерируют. Наверняка в каком-то из них касяк.
Признаю: я не гуру в вопросах дебаггинга, источника сигналов из 2000 файлов пока найти не удалось. Продолжаю поиски через принты построчно…

Офлайн

#8 Сен. 1, 2017 13:31:07

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
Продолжаю поиски через принты построчно…
Сначала через принты, но потом дойдёшь до дебаггера. Хотя разницы нет, просто дебаггер быстрее и там много всего автоматизировано (поиск функции, постановка и снятие брейкпоинтов, быстрый проход до брейкпоинта). Ещё можно input()'ы вставлять, чтобы программу останавливать на каком-то этапе (иногда надо). Так вот, вот это всё в дебаггере делается моментально, тогда как руками делаешь всё то же самое, только нужно тратить много времени. Короче, делаешь ты меньше за час, чем мог бы делать.

Почему сегфолт происходит: обычно причина либо в том, что памяти не хватает, либо в том, что идёт обращение к несуществующему элементу. Если ты неправильно что-то подключил в Qt, то оно будет выдавать тебе такой сегфолт или что-нибудь наподобие (непонятное). Там просто при разрушении виджетов происходят ещё неявные разрушения подвиджетов. И если они неправильно подключены были при создании или там удалены в процессе, то Qt об этом не узнаёт, а продолжает пытаться с ними что-то делать.



Отредактировано py.user.next (Сен. 1, 2017 13:33:14)

Офлайн

#9 Сен. 1, 2017 13:46:59

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
Сначала через принты, но потом дойдёшь до дебаггера. Хотя разницы нет, просто дебаггер быстрее и там много всего автоматизировано (поиск функции, постановка и снятие брейкпоинтов, быстрый проход до брейкпоинта). Ещё можно input()'ы вставлять, чтобы программу останавливать на каком-то этапе (иногда надо). Так вот, вот это всё в дебаггере делается моментально, тогда как руками делаешь всё то же самое, только нужно тратить много времени. Короче, делаешь ты меньше за час, чем мог бы делать.
Дебаггер, конечно, вещь. Но, если до сегфолта тот же notify() вызывается десятки-сотни тысяч раз, то сколько раз должен нажать на клавишу для перехода к следующему брейкпоинту, даже если в коде стоит лишь одна точка останова? Для принтов как раз не требуется обращение с клавишами. Задача: найти ту функцию, которая предшествовала вызову notify() до сегфолта.

Офлайн

#10 Сен. 1, 2017 14:00:52

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
то сколько раз должен нажать на клавишу для перехода к следующему брейкпоинту, даже если в коде стоит лишь одна точка останова?
Набираешь “10000 c” и он проходит 10000 раз без остановки, а потом останавливается. Плюс ещё брейкпоинты можно сохранять в файл и загружать обратно, когда ты снова собрался отлаживать то же самое. А файлы можно сделать разные, для разных случаев, ну и так далее. Сначала тоже так все сидели с принтами, а потом придумали дебаггер. Дебаггер просто автоматизирует это всё - то, что раньше делали руками.

Vady
Задача: найти ту функцию, которая предшествовала вызову notify() до сегфолта.
Да и сегфолт можно отследить. Но если ты дебаггер не освоил, то понятно, что с сегфолтом ты не разберёшься. Там всё посложнее, чем простое использование дебаггера.



Офлайн

  • Начало
  • » 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