最近發現個問題: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區域了。