qt處理pcl點雲時可能的bug(二)

2020/4/18

引子

在我使用QVTKWidget控件來展示點雲時,程序在退出過程總是出現double free,並且都生成了coredump文件:

~ [ coredumpctl list /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design                                           ] 2:33 下午
TIME                            PID   UID   GID SIG COREFILE  EXE
Mon 2020-04-13 16:26:48 CST   32417  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 16:41:12 CST   32871  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 17:34:21 CST  111607  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 20:25:11 CST  181726  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 20:27:06 CST  181928  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 21:13:38 CST  183394  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 21:25:38 CST  183681  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 22:06:34 CST  185340  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Mon 2020-04-13 22:13:45 CST  185602  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 10:38:45 CST  200606  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 10:51:32 CST  201901  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 11:04:32 CST  202635  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 11:14:00 CST  203502  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 11:37:51 CST  204136  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 11:42:00 CST  204294  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 12:29:09 CST  204755  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 13:58:23 CST  206989  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 14:01:19 CST  210128  1000  1000   6 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 14:02:08 CST  210167  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 14:06:06 CST  210350  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design
Tue 2020-04-14 14:06:34 CST  210371  1000  1000  11 present   /home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design

coredump中的函數調用棧內容如下:

 Message: Process 15096 (design) of user 1000 dumped core.
                
                Stack trace of thread 15096:
                #0  0x00007f23386b4ce5 raise (libc.so.6 + 0x3bce5)
                #1  0x00007f233869e857 abort (libc.so.6 + 0x25857)
                #2  0x00007f23386f82b0 __libc_message (libc.so.6 + 0x7f2b0)
                #3  0x00007f23386ff74a malloc_printerr (libc.so.6 + 0x8674a)
                #4  0x00007f23387015cc _int_free (libc.so.6 + 0x885cc)
                #5  0x00007f23386b7b3e __cxa_finalize (libc.so.6 + 0x3eb3e)
                #6  0x00007f2334f7a298 __do_global_dtors_aux (libvtkCommonSystem-8.2.so.1 + 0x9298)
                #7  0x00007f234beef42b _dl_fini (ld-linux-x86-64.so.2 + 0x1142b)
                #8  0x00007f23386b7537 __run_exit_handlers (libc.so.6 + 0x3e537)
                #9  0x00007f23386b76ee exit (libc.so.6 + 0x3e6ee)
                #10 0x00007f23386a002a __libc_start_main (libc.so.6 + 0x2702a)
                #11 0x000055b528db5e5e n/a (/home/oyoungy/Documents/MY_OWN_CODE_FILE/GraduationDesign/build-design-Desktop-Debug/design + 0x25e5e)

從中可以看出是內存回收時出的問題,我還以爲是我哪裏的代碼有問題,反反覆覆查閱了無數遍,依然找不到漏洞,後來,我想是否是我的智能指針用的不規範?我記得我使用了一個全局的智能指針,我便想從那裏找突破口,等我把全局智能指針改成普通的全局變量後,程序依然core dump了,因此我就排除了全局智能指針的問題;然後我又查看了一下core dump最早發生的時間,並回想了那段時間我給程序添加的代碼,最後發現我如果註釋掉代碼ui->qvtkWidget->SetRenderWindow (viewer->getRenderWindow ());,core dump就不發生了,於是,我便認爲是QVTKWidget控件的問題,畢竟其被棄用了(QVTKWidget was deprecated for VTK 8.1 and will be removed in a future version.),於是我天真的認爲把QVTKWidget控件換成QVTKOpenGLWidget就行了,於是我花半天的時間,重新編譯了vtk庫,添加了vtkGUISupportQtOpenGL模塊,替換完之後,我再次運行程序,結果還是coredump了,我又懷疑QVTKOpenGLWidget不行了,便又使用了QVTKOpenGLNativeWidget,但最終退出程序的結果依然coredump。

這是我的環境:
linux manjaro
pcl 1.9.0
VTK 8.2.0
QMake version 3.1

解決

嘗試了各種方法,依然沒用,因此我只好去stackoverflow問問題了,三天後,stackoverflow上依然沒有回答,我也閒下來了,便想鼓搗一下使用cmake構建qt項目,同時我對比了使用qmake進行構建的結果,發現在使用QVTKWidget時,cmake構建的程序在退出時不會core dump,但qmake構建的程序則報了core dump,於是,我似乎發現了上述問題的解決方法,我把我之前的項目完全遷移爲使用cmake,然後奇蹟發生了,程序退出時不再core dump了。

感受

修復這個bug花了我5、6天的時間,剛開始的時候花費了我大量精力,但是依然沒能解決,不過卻讓我確信了不是代碼的問題,後來,我開始放鬆了下來,休息好了,便想到嘗試使用cmake替代qmake,沒想到,果然試中了,也算是功夫不負有心人了吧。
這個core dump的問題不知是版本不兼容的原因,還是隻發生在我身上的個例,不過它或多或少讓我對qmake產生了一些忌憚,作爲一個剛使用qmake的新手,它就拋給了我一個核彈,它在我心中的優先級直線下降了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章