上周六也没啥事,就去公司了把这周剩下的工作结束掉,总结下。正好测试的同学在那,突然跟我说使用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
网友评论