2016-03-31 9 views
0

Qtアプリケーションで実行時エラーが発生しました。これはValgrindの出力の一部です。その前にはそれ以上のことがありますが、投稿するのは大変です。QgApplicationでのValgrindの読み取りとセグメンテーションのエラーが無効

==13659== Invalid read of size 8 
==13659== at 0x75E4085: QCoreApplication::arguments() (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x1B4E0114: ??? (in /usr/local/Qt/5.2.1/gcc_64/plugins/platforms/libqxcb.so) 
==13659== by 0x1B4E10E8: ??? (in /usr/local/Qt/5.2.1/gcc_64/plugins/platforms/libqxcb.so) 
==13659== by 0x1B9C0D2E: _SmcProcessMessage (in /usr/lib/x86_64-linux-gnu/libSM.so.6.0.1) 
==13659== by 0x1BBD48A5: IceProcessMessages (in /usr/lib/x86_64-linux-gnu/libICE.so.6.3.0) 
==13659== by 0x76096B0: QMetaObject::activate(QObject*, int, int, void**) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x767B1FD: QSocketNotifier::activated(int, QSocketNotifier::QPrivateSignal) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x7616840: QSocketNotifier::event(QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x65D20F3: QApplicationPrivate::notify_helper(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Widgets.so.5.2.1) 
==13659== by 0x65D56AD: QApplication::notify(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Widgets.so.5.2.1) 
==13659== by 0x75E0733: QCoreApplication::notifyInternal(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x7630A55: ??? (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== Address 0x178ddfb0 is 0 bytes after a block of size 16 alloc'd 
==13659== at 0x4C28147: operator new[](unsigned long) (vg_replace_malloc.c:348) 
==13659== by 0x4FAD41: GUIApp::init() (GUIApp.cpp:73) 
==13659== by 0x423009: main (main.cpp:121) 
==13659== 
==13659== Invalid read of size 1 
==13659== at 0x4C294E2: strlen (mc_replace_strmem.c:390) 
==13659== by 0x75E409B: QCoreApplication::arguments() (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x1B4E0114: ??? (in /usr/local/Qt/5.2.1/gcc_64/plugins/platforms/libqxcb.so) 
==13659== by 0x1B4E10E8: ??? (in /usr/local/Qt/5.2.1/gcc_64/plugins/platforms/libqxcb.so) 
==13659== by 0x1B9C0D2E: _SmcProcessMessage (in /usr/lib/x86_64-linux-gnu/libSM.so.6.0.1) 
==13659== by 0x1BBD48A5: IceProcessMessages (in /usr/lib/x86_64-linux-gnu/libICE.so.6.3.0) 
==13659== by 0x76096B0: QMetaObject::activate(QObject*, int, int, void**) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x767B1FD: QSocketNotifier::activated(int, QSocketNotifier::QPrivateSignal) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x7616840: QSocketNotifier::event(QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x65D20F3: QApplicationPrivate::notify_helper(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Widgets.so.5.2.1) 
==13659== by 0x65D56AD: QApplication::notify(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Widgets.so.5.2.1) 
==13659== by 0x75E0733: QCoreApplication::notifyInternal(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== Address 0x50 is not stack'd, malloc'd or (recently) free'd 
==13659== 
==13659== 
==13659== Process terminating with default action of signal 11 (SIGSEGV) 
==13659== Access not within mapped region at address 0x50 
==13659== at 0x4C294E2: strlen (mc_replace_strmem.c:390) 
==13659== by 0x75E409B: QCoreApplication::arguments() (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x1B4E0114: ??? (in /usr/local/Qt/5.2.1/gcc_64/plugins/platforms/libqxcb.so) 
==13659== by 0x1B4E10E8: ??? (in /usr/local/Qt/5.2.1/gcc_64/plugins/platforms/libqxcb.so) 
==13659== by 0x1B9C0D2E: _SmcProcessMessage (in /usr/lib/x86_64-linux-gnu/libSM.so.6.0.1) 
==13659== by 0x1BBD48A5: IceProcessMessages (in /usr/lib/x86_64-linux-gnu/libICE.so.6.3.0) 
==13659== by 0x76096B0: QMetaObject::activate(QObject*, int, int, void**) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x767B1FD: QSocketNotifier::activated(int, QSocketNotifier::QPrivateSignal) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x7616840: QSocketNotifier::event(QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== by 0x65D20F3: QApplicationPrivate::notify_helper(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Widgets.so.5.2.1) 
==13659== by 0x65D56AD: QApplication::notify(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Widgets.so.5.2.1) 
==13659== by 0x75E0733: QCoreApplication::notifyInternal(QObject*, QEvent*) (in /usr/local/Qt/5.2.1/gcc_64/lib/libQt5Core.so.5.2.1) 
==13659== If you believe this happened as a result of a stack 
==13659== overflow in your program's main thread (unlikely but 
==13659== possible), you can try to increase the size of the 
==13659== main thread stack using the --main-stacksize= flag. 
==13659== The main thread stack size used in this run was 8388608. 

私は以下の私のコードでporting code Qt3 to Qt5 and from 32-bit to 64-bit.ライン73 AMがtest = new char*[2];です。

私のプログラムは、showFullScreen()呼び出しでセグメンテーションフォルトでクラッシュするようです。

変数testを使用すると、Valgrindの出力とプログラムのクラッシュが発生する可能性がありますか? 64ビットLinuxのargcとargvの形式は32ビットと同じですか?

void GUIApp::init() 
{ 
    QApplication::setStyle("motif"); 

    int nbrparams=1; 
    test = new char*[2]; 
    test[0] = new char[100]; 
    test[1] = new char[100]; 
     printf(" Test : %d\n", (int)sizeof test);  // Test : 8 
     printf(" *Test : %d\n", (int)sizeof *test); // *Test : 8 
     printf("**Test : %d\n", (int)sizeof **test); // **Test : 1 
    strcpy(test[0], "gv_GUI"); 

    go_app = new QApplication(nbrparams,test); 

    translator = new QTranslator(0); 
    // load translation file, make sure that this symbolic link points to the desired translation file 
    if (translator->load("tt2_go.qm")) { 
     go_app->installTranslator(translator); 
    } 

    gaw = new GO_QT_Application_Widget(GO_GUI_MODE, mytalkbackptr, NULL, "QTApp"); 
    gaw->init(); 
    gaw->startup(); 

    gaw->move(0,0); 
    gaw->setFixedSize(3200,1200); 
    gaw->showFullScreen(); 

    init_done = true; 
} 

答えて

0

まずargv[argc]は常にNULLであるように、argv配列は、最後の有効な引数の後にNULLポインタを持っていることになっています。だからあなたのコードを修正する必要最小限の調整は、あなたがそれらを有効にしたい常にますので、私は、引数のnewを行うためのポイントが表示されない、

test[1] = NULL; /* instead of test[1] = new char[100]; */ 

第二になります。たぶん、そこに私が見ていないいくつかの利点がある(私はCの背景を知っている)が、以下は私がこれについて書いたコードです。それは動作します。

char * progName = "myProg"; 
char * arg1 = "-n"; 
char * arg2 = "10"; 

char *test[] = { 
    progName, 
    arg1, 
    arg2, 
    NULL 
}; 

int nbrparams=3; 

go_app = new QApplication(nbrparams, test); 
+0

これはまだ動作しません.QApplicationはargcを参照し、常に有効であることを期待しています。 – peppe

+0

提案された書き換えの変更valgrindの出力はプログラムがクラッシュします。私はargvが私の問題の原因ではないと思う傾向があります。また、警告:文字列リテラルから 'char *'への変換は廃止されました[-Wdeprecated-writable-strings] char * progName = "gvs_GUI"; –

関連する問題