這幾天在調一個網路攝影機的程式,把網路攝影機的映像資料讀回來,然後用H263壓縮(參考codeproject的VideoNet)。
後來程式一直出現一個Access violation(AV)的錯誤,折騰了我整整2天,終於搞出來了。
後來調試過程中發現是下面這句的問題
//Convert the data from rgb format to YUV format<br /> ConvertRGB2YUV(IMAGE_WIDTH,IMAGE_HEIGHT,data,yuv);
data為網路攝影機返回的RGB資料,yuv為轉換成的yuv資料,開始一直在找yuv和輸出資料的問題,沒有發現什麼原因,使用了各種調試工具,待會會列舉一下調試記憶體問題的工具,最後終於發現時資料來源就有問題,data的資料有問題,於是開始看網路攝影機返回的資料,發現網路攝影機返回資料的個數為50688個byte,解析度是176*144,本來應該是176*144*3=76032byte資料,少了很多,於是換了個網路攝影機,還是這麼多,再在同學wl的筆記本上的網路攝影機試了一下,結果正常,後來想出了個原因,網路攝影機因為是山寨貨--睿視,所以可能別人做手腳了,比如,本來只有800w,說成是1000w,而且在軟體上做手腳後,你在電腦上就是1000w。想起了以前一個同學tfand的老師買的優盤,插上電腦提示4G,但是存東西只能存2G,在電腦上明明顯示4G,但後面的2G卻用不了,呵呵,廠商在軟體上做了手腳,讓你看著是4G。wl的筆記本因為是Thinkpad,所以,網路攝影機不可能有假,目前還沒有羅技什麼的品牌網路攝影機,所以還不能驗證這一點,不過應該就是這個問題。
*******************************************
下面說一下可以調試記憶體錯誤的工具:
1.pageheap,這個工具在微軟網站可以下載到http://www.microsoft.com/downloads/details.aspx?FamilyID=69E7FB1B-1FBE-4E86-B905-74B5473499B3&displaylang=en&displaylang=en,使用說明也可以網上搜到,這個可以在output window中顯示出錯的Heap的資訊。應該是只能顯示new,malloc相關的資訊,因為我後來的那個AV問題的RGB資料是定義的一個數組,所以,這個工具就沒有顯示任何資訊。
2.gflag,這個工具也是微軟的,不過後來一直沒有用。
3.boudschecker,這個工具很強大,是Compuware公司(做DriverStudio的那個)的,在網上可以下載到,使用說明也可以搜到,http://hi.baidu.com/anglecloudy/blog/item/93d70a11f12b1a17b8127b7a.html這個工具可以嵌入到VC中,即時的給出出錯資訊和定位,很好很強大。