2012-06-23 2 views
2

현재 Qt 프로그램 중 하나를 Windows에서 Linux로 이식하는 중입니다. Qt의 유용한 매크로로 작업하기 나는 프로그램을 컴파일 할 수 있었지만 아직 작동시키지 못했습니다.이식 된 Qt 프로그램 (Windows에서 Linux로) 세분화 오류

2 개의 라이브러리와 기본 응용 프로그램 중 하나 인 기존 프로그램입니다. Windows에서 제대로 작동하고 Windows 호출이 없습니다. 그러나 응용 프로그램을 실행할 때 세그먼트 오류가 계속 발생합니다. 컨트롤러는 두 번째 라이브러리 (커뮤니케이터)를 호출 첫 번째 라이브러리 (Updater를) 호출 내 주요 응용 프로그램의 일원으로

#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() 

:

내가 다음과 같은 결과를 얻을 내 프로그램을 디버깅 가졌어요. Communicator에서 연결은 많이 발생하지만 Windows 응용 프로그램과는 아무런 차이가 없습니다.

LD_LIBRARY_PATH를 사용하여 라이브러리로드가 올바르게되었는지 확인하고 Qt Creator를 사용하여 응용 프로그램을 컴파일했습니다. 이 모든 작업은 우분투 12.04 및 Windows 7 운영 체제에서 수행됩니다.

미리 감사드립니다.

Giriel

편집 : 빠른 응답

덕분에, 내가 디버그 모드에서 컴파일 문제를 가지고 있지만 지금은 고정입니다. 그래서 QtCreator의 디버거를 실행하고 어디에 잘못되었는지 알았습니다. 문제는 제가 이유를 보지 못합니다.

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

이미 언급 한 바와 같이 세그먼트 폴트가 연결에서 발생 : 이는 잘못 코드입니다.

라이브러리의 여러 버전에서 문제는 그럴듯한 것이지만 적어도 QtCreator는 안전하다고 생각했습니다. 또한 ldd으로 확인해도 문제가없는 것 같습니다.

EDIT2 : 요청에 따라

GDB에 Qt는 소스를 추가 한 후 디버그 결과 (.gdbinit 시작시 읽을 수 있지만 QtCreator에서 작동하지 않는 것?) :

#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는 null 포인터 참조 해제입니다. 그냥 말해. – johnathon

+3

디버거가 어떤 변수를 역 참조하려고하는지 알 수있을 것입니다 ... –

+0

링크하고있는 Qt 라이브러리 세트에서'usr/lib/i386-linux-gnu/libQtCore.so.4'입니다. 빌드 시간이나 설치된 응용 프로그램에서 사용하기 위해 Ubuntu에서 설치 한 Qt 버전입니까? – Troubadour

답변

0

완전히 새로운 프로젝트를 만들고 모든 파일을 복사하여 직접 문제를 해결했습니다. 나는 오류가 사용자 파일 내에 있어야한다고 생각한다.

의견을 보내 주셔서 감사합니다.

3

먼저, QObject::connect 호출은 신호에 바인딩되지 않은 콜백의 지표 일 수 있습니다 (콜백/신호는 Qt 메커니즘 임). Linux에서 다른 Qt 버전을 Windows에서 사용하는 것의 결과 일 수 있습니다.

둘째, Qt Creator에서 디버깅하고 싶을 것입니다. 디버깅을위한 훌륭한 도구입니다.

Communicator::init()에 중단 점을 설정하고 실패한 connect() 호출을 찾습니다. 그런 다음이 connect() 호출에 전달 된 인수를 우분투 상자에 설치된 Qt 버전에 필요한 것과 비교하십시오.여기 Communicator::init() 코드를 게시 할 수 있다면 좋을 것입니다. 사람들이이 코드를 살펴보고 도움을 줄 수 있습니다.

또 다른 이유는 공유 라이브러리가 설치된 다른 버전의 Qt 버전으로 컴파일하는 것일 수 있습니다 ... 이것은 단지 야생의 추측이지만 이중 점검할만한 가치가 있습니다.

Qt 버전 문제가 아니더라도 실패한 통화를 조사하여 조사를 시작하는 것이 좋습니다. 또한 Windows에서 일부 시스템 변수를 찾을 수 없으며 실제 유효 값이 예상되는 빈 문자열/NULL 문자열을 전달 중일 수 있습니다.

+0

이 설명을 주셔서 감사합니다. 릴리스 모드에서는 디버그 모드로 컴파일하지 못했습니다. 그러나 나는 지금 그것을 고쳤고 나의 질문에 몇 가지 추가적인 정보를 제시했다. – giriel

관련 문제