这几天在调一个摄像头的程序,把摄像头的图像数据读回来,然后用H263压缩(参考codeproject的VideoNet)。
后来程序一直出现一个Access violation(AV)的错误,折腾了我整整2天,终于搞出来了。
后来调试过程中发现是下面这句的问题
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中,实时的给出出错信息和定位,很好很强大。