2012-06-23 3 views
2

В настоящее время я переношу одну из моих программ Qt из Windows в Linux. Работая с полезным макросом Qt, мне удалось скомпилировать программу, но пока не удалось ее заставить работать.Ошибка сегментации Qt (Windows to linux)

Это программа, существующая из 2-х библиотек и основного приложения. В Windows это нормально работает, и никаких внутренних вызовов Windows не существует. Но когда я запускаю свое приложение, я постоянно получаю ошибку сегментации.

После отлажена моей программы я получаю следующий результат:

#0 0x00fb098a in ??() from /usr/lib/i386-linux-gnu/libQtCore.so.4 
#1 0x00fc115d in QObject::connect(QObject const*, char const*, QObject const*, char const*, Qt::ConnectionType)() from /usr/lib/i386-linux-gnu/libQtCore.so.4 
#2 0x001355d3 in Communicator::init(int)() from ~/QtWorkspace/App/Communication/libCommunication.so.1 
#3 0x0013f7c3 in Updater::Updater(QWidget*)() from ~/QtWorkspace/App/Updater/libUpdater.so.1 
#4 0x0806a2f9 in Controller::Controller(QObject*, int, char**)() 
#5 0x08051a26 in main() 

С Контроллером является частью моего основного приложения, вызывающее первой библиотеку (Updater), который вызывает вторую библиотеку (Communicator). В Communicator много соединений, но ничего не отличается от приложения Windows.

Я использовал LD_LIBRARY_PATH, чтобы убедиться, что загрузка библиотек прошла правильно, и использовал Qt Creator для компиляции моего приложения. Все это делается на Ubuntu 12.04 и операционной системе Windows 7.

Заранее благодарен!

Giriel

EDIT:

Спасибо за быстрый ответ, у меня были проблемы с компиляции в режиме отладки, но это теперь исправлена. Поэтому я запустил отладчик QtCreator и выяснил, где он идет не так, проблема в том, что я не вижу причины. Это код, где идет не так:

fSocket = new QUdpSocket(this); 
fSocket->bind(QHostAddress::Any, 0, QUdpSocket::DontShareAddress); 
connect(fSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams())); 

происходит выдаёт ошибку сегментации ВПодключение, как я говорил уже.

Проблема с несколькими версиями библиотек является правдоподобной, но я подумал, что, по крайней мере, QtCreator будет там в безопасности. Также если я проверю с ldd Я не вижу никаких проблем там.

EDIT2:

По запросу результаты отладки после добавления источников Qt в БГД (не похоже на работу в QtCreator хотя .gdbinit считывается при запуске?):

#0 indexOfMethodRelative<8> (normalizeStringData=false, method=0x139efd "readPendingDatagrams()", 
    baseObject=0xbfffeff4) at kernel/qmetaobject.cpp:530 
#1 QMetaObjectPrivate::indexOfSlotRelative (m=0xbfffeff4, slot=0x139efd "readPendingDatagrams()", 
    normalizeStringData=false) at kernel/qmetaobject.cpp:665 
#2 0x00fc915d in QObject::connect (sender=0x825b2d0, signal=0x139f44 "2readyRead()", receiver=0xbffff160, 
    method=0x139efc "1readPendingDatagrams()", type=Qt::AutoConnection) at kernel/qobject.cpp:2592 
#3 0x00137622 in Communicator::init (this=0xbffff160, timeOut=5000) 
    at ../../App/Communication/communicator.cpp:25 
#4 0x00143dcc in Updater::Updater (this=0xbffff148, parent=0x0) at ../../App/Updater/updater.cpp:10 
#5 0x0806b2ae in Controller::Controller (this=0xbffff120, parent=0x0, argc=1, argv=0xbffff2b4) 
    at ../../App/App/controller.cpp:4 
#6 0x08054bbe in main (argc=1, argv=0xbffff2b4) at ../../App/App/main.cpp:18 

Возможно, это может помочь? readPendingDatagrams() - это частный слот.

+2

обычно, в linux, seg-fault является разыменованием нулевого указателя. Просто говорю. – johnathon

+3

Отладчик может сообщить вам, какую переменную вы пытаетесь разыменовать ... –

+0

Является '' usr/lib/i386-linux-gnu/libQtCore.so.4' из набора библиотек Qt, на которые вы ссылаетесь времени сборки или от версии Qt, установленной Ubuntu для использования установленными приложениями? – Troubadour

ответ

0

Я сам исправил эту проблему, создав полный новый проект и скопировав каждый файл. Как таковой, я думаю, что ошибка должна находиться в файле пользователя.

Спасибо всем за ваши предложения!

3

Во-первых, звонок QObject::connect, вероятно, является индикатором некоторого обратного вызова, который не может быть привязан к сигналу (обратные вызовы/сигналы являются механизмом Qt). Это может быть результатом использования другой версии Qt в Linux, чем в Windows.

Во-вторых, вы, вероятно, захотите отладить его под Qt Creator, это отличный инструмент для отладки.

Установите точку останова на Communicator::init() и найдите неисправность connect(). Затем сравните аргументы, переданные этому вызову connect(), с тем, что требуется в версии Qt, установленной в вашем поле Ubuntu.Было бы неплохо, если бы вы могли разместить здесь свой код Communicator::init(), чтобы люди могли взглянуть на него и помочь вам.

Другой причиной может быть то, что вы компилируете с одной версией Qt, а общая библиотека установлена ​​на этом ящике другой версии ... это просто дикая догадка, но стоит дважды проверить.

Даже если это не проблема с версией Qt, всегда полезно начать расследование, посмотрев на неудачный вызов. Возможно также, что он не может найти системные переменные, присутствующие в Windows, и передает некоторую пустую строку/NULL, где ожидается действительное действительное значение.

+0

Спасибо за этот комментарий, у меня возникла проблема с компиляцией в режиме отладки, который у меня не был в режиме выпуска. Но я исправил это сейчас и представил дополнительную информацию в моем вопросе. – giriel

Смежные вопросы