Russian Qt Forum

Qt => Общие вопросы => Тема начата: Evil_Genius от Октябрь 12, 2015, 09:24



Название: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 12, 2015, 09:24
В программе при выполнении инструкции return a.exec() (где a - объект QApplication) возникает Segmentation Fault.
Содержимое стека на момент краша:
Код:
0	__memmove_ssse3_back	/usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so	93	0x7ffff397c200	
1 QIODevice::read(char *, long long) 0x7ffff4b3731d
2 ?? 0x7fffd5f0a424
3 QMetaObject::activate(QObject *, int, int, void * *) 0x7ffff4c3a36e
4 QTimer::timerEvent(QTimerEvent *) 0x7ffff4c478c8
5 QObject::event(QEvent *) 0x7ffff4c3b3bb
6 QApplicationPrivate::notify_helper(QObject *, QEvent *) 0x7ffff5fc14dc
7 QApplication::notify(QObject *, QEvent *) 0x7ffff5fc6640
8 QCoreApplication::notifyInternal(QObject *, QEvent *) 0x7ffff4c0c6a3
9 QTimerInfoList::activateTimers() 0x7ffff4c609ed
10 ?? 0x7ffff4c60e31
11 g_main_context_dispatch 0x7ffff2239c5d
12 ?? 0x7ffff2239f48
13 g_main_context_iteration 0x7ffff2239ffc
14 QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) 0x7ffff4c61ae7
15 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) 0x7ffff4c0a252
16 QCoreApplication::exec() 0x7ffff4c11d3d
17 main main.cpp 41 0x4217c4


Название: Re: SegFault в QApplication::exec()
Отправлено: Авварон от Октябрь 12, 2015, 12:45
2   ??         0x7fffd5f0a424
Это явно вызов вашего метода. Ищите где забыли создать QIODevice (QFile?)


Название: Re: SegFault в QApplication::exec()
Отправлено: Old от Октябрь 12, 2015, 12:46
2   ??         0x7fffd5f0a424
Это явно вызов вашего метода. Ищите где забыли создать QIODevice (QFile?)
Скорее всего буфер для чтения.


Название: Re: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 13, 2015, 08:31
SegFault возникает, если я воспроизвожу звук с помощью QAudioOutput в Linux, при этом возникает ошибка "Got a buffer underflow!". В Windows было всё нормально.


Название: Re: SegFault в QApplication::exec()
Отправлено: __Heaven__ от Октябрь 13, 2015, 12:52
Может valgrind?


Название: Re: SegFault в QApplication::exec()
Отправлено: qate от Октябрь 13, 2015, 13:43
может пример падающего кода ?


Название: Re: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 13, 2015, 16:35
может пример падающего кода ?
Код:
int main(int argc, char *argv[]){
    QCoreApplication a(argc, argv);
    MainModule* m = new MainModule();
    return a.exec();
}

MainModule::MainModule(){
    audio.initialize();
    QFile file;
    file.setFileName("/home/path/to/file/1.wav");
    file.open(QIODevice::ReadOnly);
    QByteArray ba = file.readAll();
    audio.playSound(ba);
}

void Audio::initialize(){
    this->outputFormat.setSampleRate(44100);
    this->outputFormat.setChannelCount(1);
    this->outputFormat.setSampleSize(16);
    this->outputFormat.setCodec("audio/pcm");
    this->outputFormat.setByteOrder(QAudioFormat::LittleEndian);
    this->outputFormat.setSampleType(QAudioFormat::SignedInt);
    QAudioDeviceInfo outputInfo(QAudioDeviceInfo::defaultOutputDevice());
    if (!outputInfo.isFormatSupported(outputFormat)){
        return;
    }
    this->player = new QAudioOutput(this->outputFormat);
}

void Audio::playSound(QByteArray& sound){
    if(this->player != 0){
        QByteArray temp = sound;
        QBuffer buffer(&temp);
        buffer.open(QIODevice::ReadOnly);
        this->player->start(&buffer);
        QObject::connect(this->player, SIGNAL(stateChanged(QAudio::State)), &this->audioLoop, SLOT(quit()));
        do{
            this->audioLoop.exec();
        }while(this->player->state() == QAudio::ActiveState && this->player != 0);
        buffer.close();
    }
}

void Audio::quitLoop(){
    if(this->audioLoop.isRunning())
        this->audioLoop.quit();
    if(this->player != 0)
        this->player->stop();
}



Название: Re: SegFault в QApplication::exec()
Отправлено: __Heaven__ от Октябрь 13, 2015, 17:21
А может быть такое, что в одном потоке ваши объекты пытаются завершиться, а в главном потоке память из под них уже вычищена?


Название: Re: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 13, 2015, 18:50
А может быть такое, что в одном потоке ваши объекты пытаются завершиться, а в главном потоке память из под них уже вычищена?
Приложение однопоточное.


Название: Re: SegFault в QApplication::exec()
Отправлено: qate от Октябрь 14, 2015, 08:44
а где хеадер ?

а если попробовать так: QTimer::singleShot(1, [=] { MainModule* m = new MainModule(); });


Название: Re: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 14, 2015, 08:57
а где хеадер ?

а если попробовать так: QTimer::singleShot(1, [=] { MainModule* m = new MainModule(); });
Заголовочные файлы не содержат ничего особенного, поэтому их не приводил.
Добавил строку которую вы написали - ничего не изменилось, тот же SegFault.


Название: Re: SegFault в QApplication::exec()
Отправлено: qate от Октябрь 14, 2015, 11:37
Заголовочные файлы не содержат ничего особенного, поэтому их не приводил.

я просил рабочий, компилируемый пример, а не обрезки кода


Название: Re: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 14, 2015, 12:33
Audio.h:
Код:
#include <QBuffer>
#include <QAudioOutput>
#include <QEventLoop>

class Audio : public QObject {
    Q_OBJECT
public:
    void initialize();
   
public slots:
    void playSound(const QByteArray& sound);

public:
Audio();
~Audio();
    QAudioOutput* player;
    QAudioFormat outputFormat;
    QEventLoop audioLoop;
QByteArray outputByteArray;
bool initializeAudioOutput();
    void quitLoop();
};
MainModule.h:
Код:
#include "audio.h"

class MainModule : public QObject{
    Q_OBJECT
public:
    MainModule();
private:
    Audio audio;
};


Название: Re: SegFault в QApplication::exec()
Отправлено: qate от Октябрь 15, 2015, 12:52
где конструктор и деструктор Audio ?
еще раз прошу проект в компилируемом виде т.е. в zip архиве где есть файл проекта и исходники и для сборки достаточно набрать qmake и make
неполные куски кода неинтересны


Название: Re: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 15, 2015, 13:13
где конструктор и деструктор Audio ?
еще раз прошу проект в компилируемом виде т.е. в zip архиве где есть файл проекта и исходники и для сборки достаточно набрать qmake и make
неполные куски кода неинтересны

Конструктор и деструктор по умолчанию. То что было предоставлено выше - весь исходный код, а не "неполные куски кода".


Название: Re: SegFault в QApplication::exec()
Отправлено: qate от Октябрь 15, 2015, 16:54
да, проигрывает все и падает
посмотрю завтра


Название: Re: SegFault в QApplication::exec()
Отправлено: gil9red от Октябрь 15, 2015, 18:45
У меня падает если файл с wav не найден и пустой буфер попадает на воспроизведение и тут this->player->start(&buffer); падает


Название: Re: SegFault в QApplication::exec()
Отправлено: Evil_Genius от Октябрь 16, 2015, 08:53
Принудительная остановка QAudioOutput после воспроизведения решает проблему. Проблема с буфером осталась, но это уже совсем другая история...
Код:
this->player->stop();


Название: Re: SegFault в QApplication::exec()
Отправлено: qate от Октябрь 16, 2015, 09:05
также работает если buffer и temp перевести в динамическую память, видимо плеер чтото с ним делает, когда его уже нет