SylixOS內存錯誤排查方法

  1.應用程序測試代碼

測試代碼如程序清單 1.1所示:app

程序清單 1.1工具

#include <stdio.h>測試

 

int main (int argc, char **argv)spa

{命令行

sleep(2);debug

volatile int *a = (int *)0x40; //設置物理地址內存

 

printf("value = %x\n",*a); //讀取物理地址中的值源碼

*a = 0x12; //設置物理地址中的值it

 

return (0);io

}

  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下的一個有意思的地方,那就是非法地址能夠讀,可是不能寫。

相關文章
相關標籤/搜索