OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3666|回复: 15

keil能不能查到某一块内存时哪个变量在使用?

[复制链接]

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-8 10:45:18 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 Owen 于 2017-7-10 11:24 编辑

就是在用stm32f2的时候,内存溢出了,现在搞不清楚是内存泄漏导致的溢出或是其他什么原因,我想核对每次程序运行没有被释放的堆内存是哪个变量在使用,除了一个变量一个变量核对,有其他什么方法么
我这个项目是C++的,堆溢出了,有很多类,很多很多变量,所以不知道是哪个类出了问题,所以从内存上看是哪个地址的值没有释放,反过来找占用这个内存的变量。

最佳答案

查看完整内容[请看2#楼]

光说一下,就可以信服了吗?把你的程序,调试抓图片贴出来才有说服力。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2017-7-8 10:45:19 | 显示全部楼层
Owen 发表于 2017-7-10 13:38
已经找到了,呵呵,服死我吧
其实这个办法挺好实现的,设置一个断点,每次程序向想要查看的内存地址写数 ...

光说一下,就可以信服了吗?把你的程序,调试抓图片贴出来才有说服力。
回复

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2017-7-8 11:03:48 | 显示全部楼层
肯定可以,声明一个指针,指向变量。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-7-8 13:55:28 | 显示全部楼层
mon51 发表于 2017-7-8 11:03
肯定可以,声明一个指针,指向变量。

问题就是不知道是哪个变量。我是知道内存值,但是不知道这个内存值表示哪个变量值。整个程序涉及很多变量
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2017-3-2
在线时间
15 小时
发表于 2017-7-8 14:32:35 | 显示全部楼层
可以的,USER下有个.map文件,里面有
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-7-8 15:28:50 | 显示全部楼层
johnnynice 发表于 2017-7-8 14:32
可以的,USER下有个.map文件,里面有

都是临时变量,map能看么?怎么看?
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2017-3-2
在线时间
15 小时
发表于 2017-7-8 16:04:16 | 显示全部楼层
Owen 发表于 2017-7-8 15:28
都是临时变量,map能看么?怎么看?

这个不太清楚了,不知道单步调试可不可以
回复

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2017-7-10 10:27:43 | 显示全部楼层
Owen 发表于 2017-7-8 15:28
都是临时变量,map能看么?怎么看?

临时变量,有必要知道在哪个内存里吗?反正是在堆栈里。只要知道值就行了。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-7-10 11:23:31 | 显示全部楼层
本帖最后由 Owen 于 2017-7-10 11:25 编辑
mon51 发表于 2017-7-10 10:27
临时变量,有必要知道在哪个内存里吗?反正是在堆栈里。只要知道值就行了。

我这个项目是C++的,堆溢出了,有很多类,很多很多变量,所以不知道是哪个类出了问题,所以从内存上看是哪个地址的值没有释放,反过来找占用这个内存的变量。我觉得我题目说的够清楚了啊,为啥你完全不懂我是啥意思
回复

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2017-7-10 13:12:39 | 显示全部楼层
Owen 发表于 2017-7-10 11:23
我这个项目是C++的,堆溢出了,有很多类,很多很多变量,所以不知道是哪个类出了问题,所以从内存上看是 ...

如果你能用这个方法纠正BUG,我会服死你。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-7-10 13:38:47 | 显示全部楼层
mon51 发表于 2017-7-10 13:12
如果你能用这个方法纠正BUG,我会服死你。

已经找到了,呵呵,服死我吧
其实这个办法挺好实现的,设置一个断点,每次程序向想要查看的内存地址写数据时让程序停下来,这个时候程序运行到哪,就是哪里在用这块内存。
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2017-7-10 17:26:53 来自手机 | 显示全部楼层
mon51 发表于 2017-7-10 17:16
光说一下,就可以信服了吗?把你的程序,调试抓图片贴出来才有说服力。

Access Breakpoint 配合 Call Stack + Locals 窗口实现这个没有什么问题啊,基本调试功能有什么可质疑的么?
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-7-10 18:15:12 | 显示全部楼层
K.O.Carnivist 发表于 2017-7-10 17:26
Access Breakpoint 配合 Call Stack + Locals 窗口实现这个没有什么问题啊,基本调试功能有什么可质疑的 ...

还是高级会员靠谱
回复

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2017-7-11 08:06:07 | 显示全部楼层
K.O.Carnivist 发表于 2017-7-10 17:26
Access Breakpoint 配合 Call Stack + Locals 窗口实现这个没有什么问题啊,基本调试功能有什么可质疑的 ...

不知道变量名字,只知道内存里的值,这个对应哪个变量,用断点如何有用?运行时会有许多变量值在变化。请看图:
Call Stack + Locals 窗口显示的变量名,用断点当然可以知道对应的值。这是任何IDE平台所有的基本功能。
现在问题是:从内存上看是哪个地址的值没有释放,反过来找占用这个内存的变量。
只有MEMORY窗口才是显示内存的值,按你所说的,就是只知道这里的值,去找到变量。
也不想多说了。
12.png 13.png 14.png
回复

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2017-7-11 08:54:19 | 显示全部楼层
楼主的意思,明明是想监视某个固定地址上的值,看标题却不是这么个意思,看帖子内容也不是这个意思,还说是堆内存,临时变量,你要知道堆内存临时变量在整个运行期并不会对应固定地址,虽然一开始的时候可能会对应相对固定的地址。。。

最后还说找到答案了,其实就是自己没有清楚表达意思,老实说我也给你带偏了整糊涂了,你最后所谓的解决办法并没有什么特别高明的地方
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-7-11 09:26:13 | 显示全部楼层
myxiaoniao 发表于 2017-7-11 08:54
楼主的意思,明明是想监视某个固定地址上的值,看标题却不是这么个意思,看帖子内容也不是这个意思,还说是 ...

本来就不是特别高明的解决办法,只是比一个一个核对轻松一些而已。
标题说的很明白,是要查看某个固定的内存是哪一个变量在用。你可能觉得程序运行期间,临时变量并不会固定一个地址,所以没法查看。可是请注意我说的是堆内存,没有程序员操作不会自动释放。其次堆内存里会在需要分配的内存前加 内存控制块mcb结构体,用来标识分配的内存块的大小以及是否使用,我主要监视的就是这个结构体。我的程序全部使用内部值,每次程序从相同的地方开始,用相同的数据开始运行,所以变量每一次都会分配在相同的地址上,这个内存控制块结构体每次也在相同的内存地址上。我在第一次调试中,确定某一内存内存控制块mcb结构体(假设为A)大概被改写的位置,就是大概是运行哪个或者哪几个函数的时候被改写了。然后我重新启动调试,运行到第一次调试判断的这个大概的位置,此时A地址还没有被利用,然后我用Access Breakpoint,当程序向A中写入数据的时候,程序断点。也就是说,我下一次断点时正在执行的语句就是向A中写入数据的语句,也就是正在执行语句中涉及到的变量在使用A标识的一块内存。
我这样说,可能你还是不知道我在干嘛,实在不理解的话就忽略我这个帖子吧,把你带沟里不是我的本意。K.O.Carnivist 理解我的意思,我发的是求助帖不是分享帖,我的问题已经解决,谢谢你的关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-18 15:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表