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的新手,它就拋給了我一個核彈,它在我心中的優先級直線下降了。