Russian Qt Forum
Июнь 16, 2024, 04:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: SegFault в QApplication::exec()  (Прочитано 8553 раз)
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
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Октябрь 12, 2015, 12:45 »

2   ??         0x7fffd5f0a424
Это явно вызов вашего метода. Ищите где забыли создать QIODevice (QFile?)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #2 : Октябрь 12, 2015, 12:46 »

2   ??         0x7fffd5f0a424
Это явно вызов вашего метода. Ищите где забыли создать QIODevice (QFile?)
Скорее всего буфер для чтения.
Записан
Evil_Genius
Гость
« Ответ #3 : Октябрь 13, 2015, 08:31 »

SegFault возникает, если я воспроизвожу звук с помощью QAudioOutput в Linux, при этом возникает ошибка "Got a buffer underflow!". В Windows было всё нормально.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Октябрь 13, 2015, 12:52 »

Может valgrind?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #5 : Октябрь 13, 2015, 13:43 »

может пример падающего кода ?
Записан
Evil_Genius
Гость
« Ответ #6 : Октябрь 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();
}

« Последнее редактирование: Октябрь 13, 2015, 16:37 от Evil_Genius » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Октябрь 13, 2015, 17:21 »

А может быть такое, что в одном потоке ваши объекты пытаются завершиться, а в главном потоке память из под них уже вычищена?
Записан
Evil_Genius
Гость
« Ответ #8 : Октябрь 13, 2015, 18:50 »

А может быть такое, что в одном потоке ваши объекты пытаются завершиться, а в главном потоке память из под них уже вычищена?
Приложение однопоточное.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #9 : Октябрь 14, 2015, 08:44 »

а где хеадер ?

а если попробовать так: QTimer::singleShot(1, [=] { MainModule* m = new MainModule(); });
Записан
Evil_Genius
Гость
« Ответ #10 : Октябрь 14, 2015, 08:57 »

а где хеадер ?

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

Сообщений: 1175


Просмотр профиля
« Ответ #11 : Октябрь 14, 2015, 11:37 »

Заголовочные файлы не содержат ничего особенного, поэтому их не приводил.

я просил рабочий, компилируемый пример, а не обрезки кода
Записан
Evil_Genius
Гость
« Ответ #12 : Октябрь 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;
};
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #13 : Октябрь 15, 2015, 12:52 »

где конструктор и деструктор Audio ?
еще раз прошу проект в компилируемом виде т.е. в zip архиве где есть файл проекта и исходники и для сборки достаточно набрать qmake и make
неполные куски кода неинтересны
Записан
Evil_Genius
Гость
« Ответ #14 : Октябрь 15, 2015, 13:13 »

где конструктор и деструктор Audio ?
еще раз прошу проект в компилируемом виде т.е. в zip архиве где есть файл проекта и исходники и для сборки достаточно набрать qmake и make
неполные куски кода неинтересны

Конструктор и деструктор по умолчанию. То что было предоставлено выше - весь исходный код, а не "неполные куски кода".
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 22.