Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: havok от Декабрь 27, 2009, 18:37



Название: Segmentation fault и qwt
Отправлено: havok от Декабрь 27, 2009, 18:37
Помогите, пожалуйста разобраться!
Имею windowXP, Qt 4.6.0, qwt 5.2.0.
А так же программа немного изменённая spectrogram из примеров qwt.
Так вот во время запуска вылетает ошибка:

Приложение остановлено, т.к. оно получило сообщение от операционной системы
Сигнал: SIGSEGV
Назначение: Segmentation fault

Часть кода которая вызывает её следующая:
Код:
 
    QwtPlotZoomer* zoomer = new MyZoomer(canvas());

    zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier);

    zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton);

    QwtPlotPanner *panner = new QwtPlotPanner(canvas());
    panner->setAxisEnabled(QwtPlot::yRight, false);
    panner->setMouseButton(Qt::MidButton);

    // Avoid jumping when labels with more/less digits
    // appear/disappear when scrolling vertically

    const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font());
    QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft);
    sd->setMinimumExtent( fm.width("10.0") );

    const QColor c(Qt::darkBlue);
    zoomer->setRubberBandPen(c);
    zoomer->setTrackerPen(c);
А вот как этот класс описан:
Код:
class MyZoomer: public QwtPlotZoomer
{
public:
    MyZoomer(QwtPlotCanvas *canvas):QwtPlotZoomer(canvas)
    {
        setTrackerMode(AlwaysOn);
    }
    virtual QwtText trackerText(const QwtDoublePoint &pos) const
    {
        QColor bg(Qt::white);
        bg.setAlpha(200);
        QwtText text = QwtPlotZoomer::trackerText(pos);
        text.setBackgroundBrush( QBrush( bg ));
        return text;
    }
};
Почти всё сохранено как в примере. Кстати, сам пример тоже не запускается.
P.S. В Linux'е всё работает!


Название: Re: Segmentation fault и qwt
Отправлено: Dendy от Декабрь 27, 2009, 18:43
Кода явно недостаточно, чтобы проверить у себя. Рекомендация очевидна - запустите под отладчиком и посмотрите где именно крешится.


Название: Re: Segmentation fault и qwt
Отправлено: havok от Декабрь 27, 2009, 18:48
М... При пошаговом режиме. Он без проблем пробегает ВСЁ. И запускает окно. Спекрограама не закрашена. И потом, при наведении мыши на это окно выдаёт сию ошибку.


Название: Re: Segmentation fault и qwt
Отправлено: Dendy от Декабрь 27, 2009, 18:54
Я с трудом догадываюсь что это за "оно", и как "оно" выдаёт ошибку. Прикрепите скриншот, что ли.


Название: Re: Segmentation fault и qwt
Отправлено: havok от Декабрь 28, 2009, 08:28
Я с трудом догадываюсь что это за "оно", и как "оно" выдаёт ошибку. Прикрепите скриншот, что ли.

Появляется окно (первый скрин). Не закрашенная (А в линухе закрашена). Затем при наведении мышкой на Плот Вылетает ошибка (второй скрин)!

Если закоментить часть кода (см первое сообщение), то ошибки не возникает. Но он и ничего не рисует! При пошаговом пробеге, дебагер все строчки кода проходит. Это косяк в операционки походу... во время рисования. В Линуксе с таким же кодом всё работает. Спектрограмму рисует!


Название: Re: Segmentation fault и qwt
Отправлено: Dendy от Декабрь 28, 2009, 11:48
Насколько видно из скриншота - Creator остановил программу и можно посмотреть какой поток получил этот сигнал и что там в списке вызовов.


Название: Re: Segmentation fault и qwt
Отправлено: havok от Декабрь 28, 2009, 11:53
Ээээ... Чего-чего? :)


Название: Re: Segmentation fault и qwt
Отправлено: Dendy от Декабрь 28, 2009, 11:59
Переключаетесь на закладку "Потоки", смотрите все подряд, в каком будет написано, что он получил сигнал SIGSEGV, и слева смотрите в стеке вызовов что именно его повлекло. Таким образом определите, ошибка в вашей программе, Qwt или Qt.


Название: Re: Segmentation fault и qwt
Отправлено: havok от Декабрь 28, 2009, 12:47
Вкладка поток пуста. Нигде ничего не вижу, что можно посмотреть... :(
Вылетает в этой
bool QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject *receiver, QEvent *event)
ф-ции, как видно со скринов


Название: Re: Segmentation fault и qwt
Отправлено: Dendy от Декабрь 28, 2009, 14:23
Видно у вас Qwt без исходников. И крешится именно в ней. Соберите Qwt сами и перепроверьте ещё раз - должно показать где именно. И багрепорт написать не забудьте.


Название: Re: Segmentation fault и qwt
Отправлено: havok от Декабрь 28, 2009, 15:22
Нет. С исходниками. Собирал и добавлял qwt как по этой http://www.prog.org.ru/topic_11725_0.html статье... ???


Название: Re: Segmentation fault и qwt
Отправлено: ритт от Декабрь 28, 2009, 15:23
ну, QwtPicker и крашит, судя по скрину.
нужно смотреть что он там в ивентФильтре делает...


Название: Re: Segmentation fault и qwt
Отправлено: havok от Декабрь 28, 2009, 15:33
QwtPicker.cpp
Код:
/*!
  \brief Event filter

  When isEnabled() == true all events of the observed widget are filtered.
  Mouse and keyboard events are translated into widgetMouse- and widgetKey-
  and widgetWheel-events. Paint and Resize events are handled to keep
  rubberband and tracker up to date.

  \sa event(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
      widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
      widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
bool QwtPicker::eventFilter(QObject *o, QEvent *e)
{
    if ( o && o == parentWidget() )
    {
        switch(e->type())
        {
            case QEvent::Resize:
            {
                const QResizeEvent *re = (QResizeEvent *)e;
                if ( d_data->resizeMode == Stretch )
                    stretchSelection(re->oldSize(), re->size());

                if ( d_data->rubberBandWidget )
                    d_data->rubberBandWidget->resize(re->size());
            
                if ( d_data->trackerWidget )
                    d_data->trackerWidget->resize(re->size());
                break;
            }
            case QEvent::Leave:
                widgetLeaveEvent(e);
                break;
            case QEvent::MouseButtonPress:
                widgetMousePressEvent((QMouseEvent *)e);
                break;
            case QEvent::MouseButtonRelease:
                widgetMouseReleaseEvent((QMouseEvent *)e);
                break;
            case QEvent::MouseButtonDblClick:
                widgetMouseDoubleClickEvent((QMouseEvent *)e);
                break;
            case QEvent::MouseMove:
                widgetMouseMoveEvent((QMouseEvent *)e);
                break;
            case QEvent::KeyPress:
                widgetKeyPressEvent((QKeyEvent *)e);
                break;
            case QEvent::KeyRelease:
                widgetKeyReleaseEvent((QKeyEvent *)e);
                break;
            case QEvent::Wheel:
                widgetWheelEvent((QWheelEvent *)e);
                break;
            default:
                break;
        }
    }
    return false;
}

А подскажите пожалуйста куда конкретно смотреть! :-[


Название: Re: Segmentation fault и qwt
Отправлено: Dendy от Декабрь 28, 2009, 15:40
Если местным знатокам интересно - запакуйте программу и прикрепите. Возможно проблема не в Qwt, а в вашем клиентском коде.


Название: Re: Segmentation fault и qwt
Отправлено: havok от Декабрь 28, 2009, 15:56
Если местным знатокам интересно - запакуйте программу и прикрепите. Возможно проблема не в Qwt, а в вашем клиентском коде.

В Линуксе ведь всё работает...


Название: Re: Segmentation fault и qwt
Отправлено: ритт от Декабрь 28, 2009, 17:37
конкретно смотреть цепочку widgetMouseMoveEvent -> updateDisplay -> PickerWidget::updateMask
полагаю, проблема где-то там...


Название: Re: Segmentation fault и qwt
Отправлено: Rcus от Декабрь 28, 2009, 18:24
В Линуксе ведь всё работает...
У вас заработало? А у меня без изменения локали данные не читались, ибо fscanf, а запуск следующим образом не доходит до появления окна
Код:
main@krchome:/tmp/masterPlot$ valgrind --malloc-fill=80 --free-fill=ff ./myPlot


Название: Re: Segmentation fault и qwt
Отправлено: havok от Январь 19, 2010, 21:32
Всё решилось переустановкой всего)))