写bug的时候遇到了一个core dump的问题。百思不得其解。现场是这样的,对一个指针进行delete的时候,delete crash。产生core文件,记录下来现场,是delete进行检查时,abort生效。导致失败的。
经过一顿猛如虎的操作过后,发现malloc的时候会在这个指针前面创建一个我们不可见的head chunk。所以我就怀疑如下几点:
1. 有人把这个指针做了减一操作,然后对头进行了修改。导致delete check的时候失效。
2. 有另外一个队内存的操作写越界了,刚好把这个头部里的内容写混乱了,导致delete check失效。
总结起来就是一点,头部失效!
排除问题的时候,我们组是我们公司最牛逼的一个组。应该不会有人对指针做减法然后赋值,这么彪的操作。
我就怀疑是不是自己写哪个数组的时候写越界了,各种边界检查。在代码的海洋里遨游。最后也被自己否决了。因为如果写越界刚好写坏了头部的话,那也不能每次都刚好写坏了那一个头吧。所以第二种应该也不可能。
最后我怀疑了,这个指针根本就没有头部。然后delete的时候check head的时候自然无效。所以失败。
大概情况是这样的。
uint8_t *p = (uint8_t *)data;
delete[] p;
p = null;
就是这个delete crash了。!
总结:
delete crash情况:
1. 有头部:
1.1:一直crash在一个地方,对指针做了减法然后赋值。
1.2:crash在不一样的地方,有地方越界了,可以用asan,valgrind进行越界检查。
2. 没头部:
2:没头部,你delete什么?