SylixOS內存錯誤排查方法
1.應用程序測試代碼
測試代碼如程序清單 1.1所示:
程序清單 1.1
#include <stdio.h>
int main (int argc, char **argv)
{
sleep(2);
volatile int *a = (int *)0x40; //設置物理地址
printf("value = %x\n",*a); //讀取物理地址中的值
*a = 0x12; //設置物理地址中的值
return (0);
}
2.模擬器運行結果
在mini2440模擬器上的運行結果如圖 2.1所示:
圖 2.1模擬器運行結果
標號1處表示測試程序的加載地址,這裏為0x60030000
標號2處表示引起錯誤的那條指令在內存中的地址,這裏為0x600302ec
標號3處表示引起內存訪問錯誤的地址,這裏是0x40,意思是系統進行了一個訪問0x40這個內存地址的操作,從而導致了內存錯誤
標號4處表示內存訪問錯誤類型,這裏是can not write,意思就是系統執行了一個寫內存的操作,但是這個內存地址是不允許寫的,從而引起內存錯誤
3.反匯編測試程序
本測試程序是用debug模式編譯所得,將測試程序和sylixos-objdump工具拷貝到同一個目錄下,如圖 3.1所示:
圖 3.1拷貝測試程序和反匯編工具
在空白處按住shift並右擊,選擇"在此處打開命令窗口",如圖 3.2所示:
圖 3.2打開命令窗口
在打開的命令行中輸入:arm-sylixos-eabi-objdump.exe -S -d 2440_test_app >app.dis,在同一目錄下將生成一個app.dis反匯編文件,如圖 3.3所示:
圖 3.3生成反匯編文件
4.分析反匯編文件
由之前分析得知,測試程序的加載地址=0x60030000,引起錯誤的那條指令在內存中的地址=0x600302ec。所以可以計算出引起錯誤的那條指令在內存中的偏移為0x600302ec-0x60030000=0x2ec。這個地址就是引起錯誤的那條指令在反匯編文件的匯編地址,如圖 4.1所示:
圖 4.1查看反匯編文件
可以看出0x2ec匯編地址處對應的是一條寫內存指令,對應的c語句是"*a = 0x12",這就是源碼中出錯的地方。通過這個測試也發現了SylixOS下的一個有意思的地方,那就是非法地址可以讀,但是不能寫。
SylixOS內存錯誤排查方法