求教:有关内存改写的调试手段及定位方法!小弟先抛砖引玉

gunj 2006-07-21 10:56:51
vxworks系统下:
内存的改写,可能上块顺序改写,也可能是指针飞改。
各位大侠有啥好的方法来找出改写的源头呢?(可以有添加调试信息及保护代码,假设我们可以修改操作系统代码)

我先来一个简单的:
1,对付野指针(释放后继续使用的),修改释放函数,在释放函数return前,将该指针赋值为无效地址(如0xffffffff之类),当该指针再次被使用时,就会引发数据异常,从而调用栈也有了。



各位大侠,请继续!
...全文
232 点赞 收藏 8
写回复
8 条回复
goodluckyxl 2006年07月23日
楼主的目标代码的内存修改追踪
通常手段借助于调试IDE的对软件调试中断的条件支持
如果支持存储内容修改中断的条件
那么ok 可以通过查看跟踪堆栈过程看到最终调用的函数和代码
回复 点赞
mLee79 2006年07月23日
不是说了么, 自己管理的内存, 想什么时候查内存错误都可以, 不过一般都只在 free 的时候检查当前的内存块, 在程序退出的时候把所有的检查一遍, 在怀疑有问题的代码后面也顺便检查了一下, 有毛病的时候就打出内存分配的文件名行号,序号, 大小等等东西 ,到现在还没有遇到过什么内存的问题 ...
回复 点赞
mLee79 2006年07月22日
通常的时候都是自己管理内存的, 一般的越界啊, 泄漏什么的都还是比较好查..
回复 点赞
gunj 2006年07月22日
的确,一般的越界,泄漏是比较好查的。
但我们假设,代码规模很大(上百万行),开发不可能一个人完成,虽然有编程规范的约束,
仍然不能杜绝出错的可能。
那么这个时候,我们就应该从另一个方法来加以保护,即在内存发生错误的时候,快速即时
的将问题定位出来。
既然情况已经发生了,采用什么样的手段,添加什么样的调试代码,从而能够将各种内存改写
的问题迅速定位出来,是这个帖子讨论的重点,还是请各位高手不吝赐教!


pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 说的有道理,我们可以对分配的内存添加
头部保护结构(含安全边界值,文件名,行号等),以此来在malloc,free时判断内存的合法性。但这种情况对内存飞改的情况作用就很有限了。
回复 点赞
jixingzhong 2006年07月22日
1 指针定义时候初始化
2 操作指针时候检查指针有效性
3 指针释放后置空
回复 点赞
jixingzhong 2006年07月22日
非法操作内存只能在一定程度上去预防,
却是不可能杜绝的,(能杜绝就没有黑客存在的空间了) ...
关键是养成良好的编程习惯 ...
回复 点赞
pigsanddogs 2006年07月21日
重载new, new[], delete, delete[], VirtualAlloc, VirtualFree等函数
建立一个类
struct CLog
{
string file;
int fileline;
};
建立一个全局的map<size_t, CLog>对象.
分配的重载时候象map中插入new的地址, 哪个原文件, 代码行.
释放的重载释放掉map中的对应的size_t地址.

最后类的虚构的时候把map的trace打映出来, 可有效的检测类村泄露
回复 点赞
Dong 2006年07月21日
我觉得垃圾收集和异常处理会是非常好的内存管理方式
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告