昨天朋友问到是否有0xc0000374的堆栈损坏的排查经验。平时遇到堆栈损坏的问题不少,还真没有留意某一个错误码的堆栈损坏。好巧不巧,下班的时候就碰到同事遇到了同样的问题。
复现问题 每次崩溃的地址是在这里,观察对象内存,没有发现内存无法读取或者乱码类的数据,看起来是正常的.根据反汇编代码知道崩溃就发生在delete这个调用中,也就是CShape所指向对象的析构中.
分析问题分析对象的内存,发现了一些崩溃之前对象内存的特征码,然后设置条件断点。 F11步入 发现该对象的析构竟然直接进入了基类析构,而不是派生类对象的析构函数,明显是有问题的.所以怀疑该对象已经内存遭到了损坏.于是加入了监视对象内存的情况: 显而易见的Double Free.
这里的问题还是比较简单的,毕竟内存破坏是在比较近的区域。接下来和同事分析了一下可能存在double free的代码,很快定位出了具体的问题出处。这是基于源码分析的,如果无源码的话,得想一种办法,记录程序运行过程中访问的内存,这样才好溯源.本片文章就暂时记录这里,后续看看是否能使用内存搜索的方式定位嫌疑位置.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!