1. 程式人生 > >SylixOS內存錯誤排查方法

SylixOS內存錯誤排查方法

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內存錯誤排查方法