赞
踩
首先遇到core文件,一般会采用gdb + 进程执行命令 + core名称(遇到core文件带单引号的 可以用 \ 转义下)。
定位到core的代码行数,一般分两种情况:
1、代码是自己业务代码行。
这种情况下一般情况比较容易解决,大部分为:
1、对空指针操作;不管别的模块是否判断指针,对指针操作前一定要先判空。
2、数组溢出;要注意取值范围,常见的是字符串的问题。
3、类析构时出现;当进程是通过调用共享库编译出的库时,如果某个库未及时编译,会出现这种问题,全量重编可以解决,也可以分析是否有依赖的文件修改而没有及时编译相应的库。
4、单线程跑的时候没问题,多线程跑会偶发core。这种情况一般是存在多线程同时操作线程不安全的变量,这种时候需要加锁来对该变量处理。比如多个线程往一个vector中添加成员导致core的问题。
5、使用迭代器操作序列容器时,在循环内对容器操作,比如在对vector对象循环时还添加成员。
2、代码是其他的代码。
1、如果是基础模块的代码,比如stl底层的vector头文件,这种情况可以去看下网上关于该开源代码的使用规范,限于能力与经历有限,目前遇到的问题都是自己业务代码的错误,还未亲身遇到因底层文件缺陷导致core的问题。看到有关的文章中,有人遇到不同linux版本内核中对某入参变量的限制不同,传入的字符数组只会取固定长度,导致返回后再操作时报错的。
2、其他开发团队的代码,这种情况一般是找对应开发团队来帮忙看下,毕竟没有源码要分析问题难于上青山。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。