本文件目的在於**部分qt程式在嵌入式板子上出現buserror問題的除錯及解決方法;
以數碼相框程式出現的buserror為例;
2.1產生buserror的可能原因:
buserror即匯流排錯誤,buserror通常都是因為非對齊訪問造成的。cpu在設計上為了效能上的考慮,要求待訪問,操作的資料位址都要對齊。如果發現沒有對齊的訪問,就會向當前程序發出sigbus訊號,使程式崩潰。risc包括mips都是這種型別的晶元。而x86架構就沒有這種對齊要求。所以**在嵌入式環境下有匯流排錯誤而在x86下面可能就沒有問題,當然這是有效能的代價。
1機器物理問題或者訪問無效實體地址,但這種情況非常少見。
2linux平台上執行malloc(),如果沒有足夠的ram,linux不是讓malloc()失敗返回,
而是向當前程序分發sigbus訊號。
3某些架構上訪問資料時有對齊的要求,比如只能從4位元組邊界上讀取乙個4位元組的資料型別。ia-32架構沒有硬性要求對齊,儘管未對齊的訪問降低執行效率。另外一些架構,比如sparc、m68k,要求對齊訪問,否則向當前程序分發sigbus訊號。
sigbus與sigsegv(產生段錯誤segmentfault)訊號一樣,可以正常捕獲。sigbus的預設行為是終止當前程序並產生coredump。
sigbus與sigsegv訊號的一般區別如下:
1sigbus(buserror)意味著指標所對應的位址是有效位址,但匯流排不能正常使用該
指標。通常是未對齊的資料訪問所致。
2sigsegv(segmentfault)意味著指標所對應的位址是無效位址,沒有物理記憶體對
應該位址。
2.2數碼相框產生buserror的除錯:
經過查詢資料:嵌入式板子上如果程式初始化執行無任何除錯資料輸出即馬上出現buserror,則很大原因是由於交叉編譯環境中的庫和檔案系統裡庫的不一致,或者編譯的引數有問題之類的原因導致的非對齊訪問資料位址。重新配置好編譯引數及更新檔案系統內的庫一般都能解決問題;
qt中qtimer類提供了定時器訊號和單觸發定時器。它在內部使用定時器事件來提供更通用的定時器。qtimer很容易使用:建立乙個qtimer,使用start()來開始並且把它的timeout()連線到適當的槽。當這段時間過去了,它將會發射timeout()訊號。而qtimeline也有相同的機制。我們通過連線訊號與槽函式,實現了時間間隔改變的顯示,從而實現切換特效。
從實際出發,分析數碼相框程式中**的執行效率,可以發現數碼相框從檔案中載入資料到快取,以及畫圖事件中的顯示均需要占用系統大部分資源來實現,由於數碼相框程式中為了實現比較流暢的特效,定時器及動畫的間隔均設定的很短,時間約10ms~30ms出發一次畫圖,這時候便要求系統在這個時間間隔內能順利的實現的顯示,若在這個時間間隔內系統無法完全執行完畫圖事件,則定時到時間系統又重新呼叫槽函式進入畫圖事件,可能會導致重入的問題。
由於當系統試圖訪問一塊無檔案內容對應的記憶體區域,比如超過檔案尾的記憶體區域,或者以前有檔案內容對應,現在為另一程序截斷過的記憶體區域則會發生buserror,那麼可以猜測數碼相框可能是由於函式重入問題導致的buserror,除錯一下,先在數碼相框中對定期器及動畫類觸發的槽函式做以下處理:定時器定時觸發槽函式,進入槽函式關閉定時器,實現槽函式後再開啟定時器,同理,動畫類可以用暫停的方式;用此方法避免函式重入的問題,再交叉編譯到板子上進行測試,發現程式穩定性有所提高,但是依然有buserror問題出現,分析除錯資訊,此時發現第一種情況出現buserror的問題得到解決,現在程式的buserror集中到第二個位置,即在畫圖事件中實現填充區域的qpainter成員函式fillrect()時出現buserror。
分析qt原始碼,fillrect實現方式如下:
fillrect(r,qt::solidpattern);
setbrush(qt::solidpattern);drawrect(r);
inlinevoidqpainter::drawrect(constqrectf&rect)
drawrects(&rect,1);
voidqpainter::drawrects(constqrect*rects,intrectcount)
qt原始碼中對於類的包裝導致我們比較難分析出其如何具體操作硬體,而且並不是每一次執行此行**都會導致buserror,故猜測可能程式某些客觀存在的指標導致其實現fillrect偶然性出現未對齊的資料訪問。故對於數碼相框專案而言,我們暫時採取用其他方式填充螢幕區域:設定黑色背景圖的方式,再經過測試,數碼相框程式終於能比較穩定的執行了。
由於並未聯絡loongson1b開發板底層的實現來分析buserror,故並沒有真正**到buserror出現的原因是硬體上、底層軟體上或者確實是程式本身的原因,所以此文件有待補充。
Linux程式除錯 Bus Error
一,bus error究竟是指什麼 bus error,即匯流排錯誤。引發原因 cpu處於效能方面的考慮,要求對資料進行訪問時都必須是位址對齊的。如果發現進行的不是位址對齊的訪問,就會傳送sigbus訊號給程序,使程序產生 core dump。risc包括sparc 一種微處理器架構 都是這種型別的...
Linux程式除錯 Bus Error
一 bus error,即匯流排錯誤。引發原因 cpu出於效能方面的考慮,要求對資料進行訪問時都必須是位址對齊的。如果發現進行的不是位址對齊的訪問,就會傳送sigbus訊號給程序,使程序產生 core dump。risc包括sparc 一種微處理器架構 都是這種型別的晶元。x86系列cpu都支援不對...
Qt 程式出現錯誤
usr bin ld main.o relocations in generic elf em 40 usr bin ld main.o relocations in generic elf em 40 usr bin ld main.o relocations in generic elf em ...