某个内存的值被改变了,怎么查是"谁"改变了这个内存的值?在线等

celerylxq 2011-11-11 10:27:54
某个内存的值被改变了,怎么查是"谁"改变了这个内存的值?
变量A的地址为0x20a0,程序中只给A附了初值,在断点处发现A的值变成0xFF87,要怎么查是哪个指针改了这个内存的值?
...全文
499 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
celerylxq 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 arofree 的回复:]
IAR上有这功能,得试试,我没有试过,有set data breakpoint
[/Quote]
在哪个菜单下有set data breakpoint?没找到啊,打开Breakpoints窗口,右键弹出菜单中New Breakpoint子菜单中也没有,求教?
对了,我用的IAR 5.10.1 难道是这个版本没有?
莫名的默默 2011-11-15
  • 打赏
  • 举报
回复
IAR上有这功能,得试试,我没有试过,有set data breakpoint
healer_kx 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]

下内存断点
[/Quote]
++
celerylxq 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pochioly 的回复:]
刚看到我以为LZ问的是程序自身如何意识到这种行为。。。而不是后面看到的借助于调试器。。Win32下可以设置保护+异常处理程序。。嵌入式呢坐等大牛
[/Quote]
程序自身似乎没法意识到这种问题。。。比如定义了int a[2];for(int i=0;i<5;i++)a[i]=i;
编译器发现不了这个问题(不只是嵌入式,pc上一样),只要IDE能支持内存断点就好查了。
celerylxq 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yflk 的回复:]
典型的内存越界问题!可以记下该内存的地址,然后查一下在它前面定义的其它内存操作。
[/Quote]
系统分配内存时与代码中定义变量的前后顺序不一致,所以很难找。
IAR不能设置类似的内存断点,杯具的IED,如果带一操作系统,或者程序很复杂,查这样的内存问题太艰难了。。。
sanae 2011-11-12
  • 打赏
  • 举报
回复
刚看到我以为LZ问的是程序自身如何意识到这种行为。。。而不是后面看到的借助于调试器。。Win32下可以设置保护+异常处理程序。。嵌入式呢坐等大牛
hjy_x 2011-11-12
  • 打赏
  • 举报
回复
内存越界操作,改内存值被篡改了,建议你通过log分段输出的方式查找。
YFLK 2011-11-11
  • 打赏
  • 举报
回复
典型的内存越界问题!可以记下该内存的地址,然后查一下在它前面定义的其它内存操作。
celerylxq 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luciferisnotsatan 的回复:]
去看下你用的调试器的帮助文档吧,应该有如何设置各种断点的介绍
[/Quote]
多谢,我去看看
luciferisnotsatan 2011-11-11
  • 打赏
  • 举报
回复
去看下你用的调试器的帮助文档吧,应该有如何设置各种断点的介绍
celerylxq 2011-11-11
  • 打赏
  • 举报
回复
求解,求解!csdn应该有嵌入式编程高手吧,或者我发错板块了?
celerylxq 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 celerylxq 的回复:]
某个内存的值被改变了,怎么查是"谁"改变了这个内存的值?
变量A的地址为0x20a0,程序中只给A附了初值,在断点处发现A的值变成0xFF87,要怎么查是哪个指针改了这个内存的值?
[/Quote]
怎么设置内存断点?设置内存断点是否和编译器有关系?我用的IAR,单片机编程。
luciferisnotsatan 2011-11-11
  • 打赏
  • 举报
回复
vs2005里,new breakpoint-》new data breakpoint
luciferisnotsatan 2011-11-11
  • 打赏
  • 举报
回复
可以设置内存断点
  • 打赏
  • 举报
回复
下内存断点
yisikaipu 2011-11-11
  • 打赏
  • 举报
回复
求问vs2008怎样设置一个寄存器断点,即每当某寄存器值改变时断下来
赵4老师 2011-11-11
  • 打赏
  • 举报
回复
Setting a Breakpoint When the Value at a Specified Memory Address Changes
To break when the value at a specified memory address changes

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the memory address for the byte.
For a word or doubleword memory address, enclose the address in parentheses, and precede it with a cast operator. For example, WO(21406036) for the word at memory location 21406036. Use the cast operator BY for a byte (optional), WO for a word, or DW for a doubleword. (The debugger interprets all integer constants as decimal unless they begin with zero (0) for octal or zero and x (0x) for hexadecimal.)

In the Number Of Elements text box, type the number of bytes, words, or doublewords to monitor. If you used the BY operator in the Expression field, specify the number of bytes. If you used WO, specify the number of words. If you used DW, specify the number of doublewords.


Click OK to set the breakpoint.

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧