最近发现个问题: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,
Qt学习2——.pro文件和.h文件介绍LinkedHashMap基本用法&使用实现简单缓存pytorch之ResNet18(对cifar10数据进行分类准确度达到94%)华为Mate 40 Pro+ 5G曝光:徕卡电影镜头、陶瓷机身统计字母个数(java语言实现)JavaScript中的 Call 和 Apply1190 反转每对括号间的子串 leetcode记一次EventBus内存泄露导致的项目问题浅谈uni-app页面传值问题 Chrome OS,对程序员和Windows意味着什么?,互联网营销