最近发现个问题: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区域了。

技术
©2019-2020 Toolsou All rights reserved,
python中delete怎么用_python中如何使用np.delete()方法?大厂Java岗春招必看:论一个面渣逆袭之路上必学得那些知识点3 4j不是合法的python表达式_3+4j不是合法的Python表达式。SQL综合题 员工单位综合题pyqt按钮调用python程序_PyQt:链接按钮到程序中的函数找出游戏的获胜者(java)看完这个去面试,稳过~~将硬盘转换成GPT分区格式python常用内置函数C语言(猜数字小游戏)