Qt程式設計中詭異的段錯誤

2021-04-13 09:30:07 字數 984 閱讀 3581

程式設計中讓人鬱悶的事情莫過於段錯誤(也就是傳說中的core dumped),讓人更鬱悶的情況是有時候段錯誤,有時候又不段錯誤。而基於第三方庫開發的應用程式,當出現段錯誤時,更是難以除錯,因為段錯誤的**可能是在庫**中,這導致gdb工具也無法給出有用的除錯資訊。

要是真碰到這種情況,只能仰天長嘆了!

mythread::run()

...else

if(signal 

==video_stop)

break

;cvwaitkey(2);}}

原本的程式是在迴圈裡面用update()發出乙個paintevent()事件來重新整理影象的,後來看了錯誤資訊,知道了事件是不能在兩個執行緒之間傳送的,於是通過傳送訊號signal/slot的方式來實現目的,即上述執行緒向主線程傳送乙個signal(帶qimage),主線程接收這個訊號並在本執行緒內update()乙個paintevent()事件,這樣一來,就不會在兩個執行緒之間傳送事件了。

本以為問題就此解決,可以洗個腳回去睡覺了!結果還是段錯誤,而且錯誤資訊也還是一樣。於是其後有一段時間都在自我否定中,讓我對開始的一系列推理和做法將信將疑。

在其後長達n個小時的時間裡,我試著去掉一些**,來看看是否會有段錯誤的發生,結果依然還是段錯誤。終於後來感動上天....

那一夜,俱樂部,包宿....就在11點多鐘的時候:

我把cvwaitkey(2)去掉,然後編譯,執行程式,執行了一分多鐘沒有出現段錯誤,但我還不能確信,因為有時候就是跑了一分多鐘才段錯誤的,於是我一直等著...結果終於沒有再段錯誤了。

原因分析:在opencv視窗顯示中需要包含cvwaitkey(?)否則視窗無法顯示出來,因此我一直認為在qt中顯示,它也應該需要。不想竟是它出了問題,cvwaitkey(?)呼叫了系統定時器,因此可能會向該程序的所有執行緒傳送乙個事件,於是便導致了在兩個執行緒之間傳送事件的錯誤。

記一次詭異的程式執行起始就段錯誤

現象 用交叉編譯器編譯了乙個程式到板子上執行,發現執行時段錯誤,連main函式下第一句log都沒有列印。也就是詭異還沒進入main函式就已經段錯誤。分析 程式執行時理論上應該先準備分配記憶體,然後將所需要的庫對映到對應的共享庫區域,因為比較懶,所懶得在板子上搭建gdb開發環境,所以分析大概率為共享庫...

詭異的Windows程式設計

在winx的example中新增了乙個picture control控制項,自定義顯示了一幅,編譯後一切正常 然後我自己新建了乙個工程,也同樣新增了乙個picture control,在vs2008 ide看起來也一切正常,但是編譯後就不顯示該了 我研究了半天,還是不清楚這是為什麼,很困惑.url ...

詭異的C define編譯錯誤

前幾天寫 的時候遇到了乙個十分詭異的編譯錯誤。對於下面的 你能夠發現問題在那裡嗎?1 define test a,b,c 2 a 3 if b 4 c編譯器給出了下面這個錯誤資訊 去掉多餘的空格,再次編譯,通過。其實對於c c 的預處理器而言,很容易就可以過濾掉 後面多餘的空格,而沒有必要由此引發語...