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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章