美文网首页
static数据被修改了

static数据被修改了

作者: fooboo | 来源:发表于2016-04-12 22:29 被阅读100次

    上周六也没啥事,就去公司了把这周剩下的工作结束掉,总结下。正好测试的同学在那,突然跟我说使用GM添加物品时没反应了,估计是程序挂了,然后看了下工作进程,的确挂了。打开了core文件看了下调用栈,是挂在了一个uint32_t的成员变量,该表达式是一个移位操作,不大可能会挂在这儿,而且开发了大半年的项目平时也测试没啥问题,就今天挂在了这里,没道理。然后看了下这个对象的一些内容很奇怪,都是1~9的数字串,然后也访问不了。

    估计该地址的内容被非法修改了【该内容是个指针数组】。首先,这个对象是单例:

    CObj * GetInstance()

    {

          static CObj m_Obj;

          return &m_Obj;

    }

    然后因为是局部static成员,只有在首次调用的时候被初始化,分配在静态存储区,那么到底是哪个代码修改了它?

    由于问题不大好复现,因为程序运行着一段时间才有可能出现这种错误,而且首次出现这种问题,只能watch这个变量。或者mprotect这个单例对象的指针数组成员所占的内存,当被修改时回调某个函数打印出调用函数栈来分析,目前只能是这样了。

    2016-04-14

    今天又想办法找那个难复现的bug了查了些资料,发现mprotect的使用有一些限制,如“锁指定的内存区间必须包含整个内存页(4K)。区间开始的地址start必须是一个内存页的起始地址,并且区间长度len必须是页大小的整数倍。“,自己写了个测试用例,是无法mprotect的,返回的errno对应的是EINVAL

    相关文章

      网友评论

          本文标题:static数据被修改了

          本文链接:https://www.haomeiwen.com/subject/bxewlttx.html