WINCE 驅動異常分析

WINCE 驅動異常分析 寫過驅動的應該都碰到過驅動程序出現異常的問題,引起異常的原因有很多,例如,棧溢出,指針錯誤等。但我們怎麼樣才能最快速的找到產生異常的地方與原因。 WINCE 爲我們編譯連接的每個.dll文件生成了一個同名的.MAP文件,我們只要通過這個MAP文件就可以快速的找到產生異常的代碼,MAP文件可以從/WINCE500/PBWorkspaces/project/RelDir/Release目錄中找到。 舉個例子,異常如下: CMMB: IOCTL_POWER_SET - Changing power state to D3 Data Abort: Thread=83a5d4a8 Proc=80426380 'device.exe' AKY=0000000d PC=01de4c94(cmmbspidrv.dll+0x00004c94) RA=01de4c94(cmmbspidrv.dll+0x00004c94) BVA=06000041 FSR=00000003 從上面我們可以看出,出現異常的是cmmbspidrv.dll驅動程序,異常地址爲cmmbspidrv.dll的RVA地址+0x00004c94(BASE地址)。 那我們再來看一下cmmbspidrv.map文件就可以清楚的知道異常產生在哪裏了。 Preferred load address is 10000000 這個表示RVA基地址 Address Publics by Value Rva+Base Lib:Object 0001:000034d4 DllEntry 100044d4 f CmmbSPI.obj 0001:00003638 CPI_Init 10004638 f CmmbSPI.obj 0001:00003aa4 CPI_Deinit 10004aa4 f CmmbSPI.obj 0001:00003b04 CPI_Open 10004b04 f CmmbSPI.obj 0001:00003b0c CPI_Close 10004b0c f CmmbSPI.obj 0001:00003b14 CPI_Read 10004b14 f CmmbSPI.obj 0001:00003b40 CPI_Write 10004b40 f CmmbSPI.obj 0001:00003b48 CPI_IOControl 10004b48 f CmmbSPI.obj 0001:00003e64 CPI_Seek 10004e64 f CmmbSPI.obj 0001:00003e6c CPI_PowerDown 10004e6c f CmmbSPI.obj 0001:00003e70 CPI_PowerUp 10004e70 f CmmbSPI.obj 結合MAP文件,我們可以很快算出異常崩潰地址爲:10004c94,查找MAP文件發現並沒有這個地址。那我們就找比它少的地址。從上面我們可以看出異常是由 CPI_IOControl 裏面產生的。再結合調試信息我們可以很準確的找到原因。 同理應用程序中的異常分析也可以採用以上的方法,用Visual Studio 2005 的可以在link->debug下設定輸出MAP文件。 總結:驅動容易出現異常很多情況是指針錯誤,或者棧溢出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章