DS5解决 内存踩踏

最近发现个问题:malloc出来的几组值(UINT32)总是发生变化,总有地方改他。

硬件平台:zynq 7045。软件平台 ucos II操作系统。

这种问题定位起来非常费劲,有可能数组越界,有可能野指针等等。

不过运气不错,我找到了神器:DS5。

1.DS5的使用

硬件连接就不用说了,软件开始。

1.1 建立工程。

将代码考入到ds5 目录下 workspace

File----->Import 

DS5解决 内存踩踏_第1张图片

选择Existing Projects into Workspace,选择next,

DS5解决 内存踩踏_第2张图片

我这已经添加了,所以不能重新添加,添加完成后选择finish即可。

1.2 debug信息。

run--->Debug Configurtations

右键DS-5 Debugger 选择new。

connection目录下 选择对应的平台。我是zynq 然后选择裸机(下面有linux)。

DS5解决 内存踩踏_第3张图片

file选择编译好的elf格式文件:

DS5解决 内存踩踏_第4张图片

Debugger选择connect only

DS5解决 内存踩踏_第5张图片

os awareness选择对应的裸机操作系统

DS5解决 内存踩踏_第6张图片

然后选择debug即可。

1.3 开始debug

分别对应 run,停止 单步调试等信息。

DS5解决 内存踩踏_第7张图片

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

watch point 监测0x60b284 == 3的时候,抓住现场。然后通过mw(改内存指令),把此地址值改成3,可以抓住mw所在线程。图如下:

DS5解决 内存踩踏_第8张图片

此时cpu stop,然后在再更改watch ponit监测 0x60b284不为3条件时抓现场。

 

DS5解决 内存踩踏_第9张图片

最后发现PC指针指向了 0x10ADB8.把elf格式的文件进行反汇编arm-linux-gcc-objdump - D xxxx.elf > xxxx.txt,

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

DS5解决 内存踩踏_第10张图片

可以看到正好处于这个函数,进行压栈时候出错了:

DS5解决 内存踩踏_第11张图片

为了证实,可以查看ds-5中的cpu的 r0-r4寄存器:

DS5解决 内存踩踏_第12张图片

正好一样,证实了错误的存在。不得不说DS-5真是款神器:

这样就可以看出了内存分布图出现错误,irq模式下的栈设置到了malloc区域了。

你可能感兴趣的:(ucos)