DS5解決 內存踩踏

最近發現個問題:malloc出來的幾組值(UINT32)總是發生變化,總有地方改他。

硬件平臺:zynq 7045。軟件平臺 ucos II操作系統。

這種問題定位起來非常費勁,有可能數組越界,有可能野指針等等。

不過運氣不錯,我找到了神器:DS5。

1.DS5的使用

硬件連接就不用說了,軟件開始。

1.1 建立工程。

將代碼考入到ds5 目錄下 workspace

File----->Import 

選擇Existing Projects into Workspace,選擇next,

我這已經添加了,所以不能重新添加,添加完成後選擇finish即可。

1.2 debug信息。

run--->Debug Configurtations

右鍵DS-5 Debugger 選擇new。

connection目錄下 選擇對應的平臺。我是zynq 然後選擇裸機(下面有linux)。

file選擇編譯好的elf格式文件:

Debugger選擇connect only

os awareness選擇對應的裸機操作系統

然後選擇debug即可。

1.3 開始debug

分別對應 run,停止 單步調試等信息。

0x60b284爲踩踏的地址:增加watch point

watch point 監測0x60b284 == 3的時候,抓住現場。然後通過mw(改內存指令),把此地址值改成3,可以抓住mw所在線程。圖如下:

此時cpu stop,然後在再更改watch ponit監測 0x60b284不爲3條件時抓現場。

 

最後發現PC指針指向了 0x10ADB8.把elf格式的文件進行反彙編arm-linux-gcc-objdump - D xxxx.elf > xxxx.txt,

打開xxx.txt,查找0x10ADB8地址或者附近地址的函數:

可以看到正好處於這個函數,進行壓棧時候出錯了:

爲了證實,可以查看ds-5中的cpu的 r0-r4寄存器:

正好一樣,證實了錯誤的存在。不得不說DS-5真是款神器:

這樣就可以看出了內存分佈圖出現錯誤,irq模式下的棧設置到了malloc區域了。

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