快取區關於位元組沒對齊而導致系統掛掉的乙個BUG

2021-09-11 23:09:48 字數 979 閱讀 5739

在網上移植了第三方的**,將mp4檔案切片成ts + m3u8檔案,在**除錯的過程中發現乙個系統會掛掉的超級大bug描述如下:

2.在寫入video資料時沒沒有任何問題,但是在寫入audio資料的時候卻一進入就掛掉。

除錯過程:

懷疑記憶體是不是被意外釋放了,由於這套**寫的並不是很規範,變數、指標滿天飛,**的冗餘度也很高,異常退出也不會將申記憶體釋放乾淨,看的頭都大,後來花了兩天的時間去熟悉**邏輯,修改**,並找是否有指標指向了快取區,然後被當做區域性的快取區釋放了。後來發現並沒有這樣的現象,問題任然存在。

直到偶然間發現乙個地方:

for(int i=0; itrack_data[i] = (track_data_t*)((char*)output_buffer + sizeof(media_data_t));

}else //track_data[1]

。。。。。。。。。。。。省略。。。。。。。。。。。。。。。。。。。。。。

}

**中的 track_data[i] 就是video / audio 快取的起始位置,問題就出在初始化  track_data[1] 的時候,track_data[1] 後邊的一系列偏移不管是多少,但是,這個偏移最後的位址是不是能落到 4 位元組整數倍上呢????!!!!!極有可能不是落在 4 的整數倍上,試著在下邊加上位元組對齊的依據**(為了不踩到前邊的資料,還特意向後偏移了4 位元組再進行4位元組對齊):

#define alignment_bytes 4

for(int i=0; itrack_data[i] = (track_data_t*)((char*)output_buffer + sizeof(media_data_t));

}else //track_data[1]

。。。。。。。。。。。。省略。。。。。。。。。。。。。。。。。。。。。。

}

最後,不再宕機了,除錯通過。。。。。果然是這。。。。

關於位元組對齊

用乙個例子簡單說明一下 v6環境 輸出結果 char 1 long 4 s1 8 s2 16 結果分析 棧由高向低增長,小端位元組序 addr s1.l 0x12ff7c addr s1.s 0x12ff78 addr s1 0x12ff78 addr s2.l 0x12ff74 addr s2.t...

關於位元組對齊

位元組 byte 是計算機資訊技術用於計量儲存容量和傳輸容量的一種計量單位,乙個位元組等於8位 二進位制數 在utf 8編碼中,乙個英文 字元等於乙個位元組。位元組按照一定規則在空間上排列就是位元組對齊。需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為...

關於快取區

c語言裡面的stdio.h庫函式裡涉及到了快取區,具體案例是這樣的 includestructuser int main int argc,const char argv 我輸入了 zhangsan 12 w 意思為 名張三 12歲 是個女的 woman 但是列印的是 zhangsan pass a...