一个双线程下同时操作指针变量导致野指针出现的问题总结

来源:http://blog.csdn.net/lezhiyong

问题:

在某项目的测试过程中,测试在高清压力测试过程中会偶尔出现RSS崩溃现象,崩溃时间不确定,由于在守护进程服务的守护下,RSS崩溃后被重新拉起,所以这个故障在崩溃马上发送时在网管上并没有体现服务停止的告警,只有当测试人员去RSS的var/run目录下找到edum***开头的文件才指定RSS发送崩溃。根据文件中提供的崩溃时间描述,有时是几天前的,有时是几个小时前的,测试人员较难回忆其当时做了什么操作。根据多个edum***文件打印出的崩溃时堆栈信息,每次崩溃出现在不同的调用代码逻辑中。这都给该问题的复现与定位造成一定困难。

问题根源:

崩溃线程崩中使用指针的真正创建与销毁地方在另另外一个线程中,崩溃线程只是使用这个指针拷贝。

这两个操作发送在两个线程中。

问题总结:

对于野指针问题,当问题根源找到时觉得问题比较轻松,但未找到前的排查真正做起来很累,更多是考验定位人员的心理素质和分析能力,总结的一些经验如下:

1、需要从崩溃点上层各个调用对象作为中介从来源到去处引起共用指针的,要细心、耐心,把来源和去处一层层追根朔源才能发现问题。

2、要善于分析日志文件中提供的信息,当第一次崩溃是由于日志输出等级低信息量不足并且不能定位与解决该问题时候需要将日志输出等级调高并加入一些辅助定位的输出信息,在下一次崩溃时候输出的日志信息将提供很大帮助。

3、解决野指针问题通过阅读代码很重要,只有这样才能对出问题时候程序线程运行的数量、运行功能和时序以及变量调用有清楚和全面的认识。

4、编写程序时候尽量少用指针拷贝,如果不得以使用,编写代码一定要具备要有多线程运行意识,从根源上杜绝野指针的出现。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 23:59:31

一个双线程下同时操作指针变量导致野指针出现的问题总结的相关文章

一个双线程下同一时候操作指针变量导致野指针出现的问题总结

来源:http://blog.csdn.net/lezhiyong 问题: 在某项目的測试过程中,測试在高清压力測试过程中会偶尔出现RSS崩溃现象,崩溃时间不确定,因为在守护进程服务的守护下,RSS崩溃后被又一次拉起.所以这个故障在崩溃立即发送时在网管上并没有体现服务停止的告警,仅仅有当測试人员去RSS的var/run文件夹下找到edum***开头的文件才指定RSS发送崩溃.依据文件里提供的崩溃时间描写叙述.有时是几天前的,有时是几个小时前的.測试人员较难回顾其当时做了什么操作. 依据多个edu

使用AFNetworking时, 控制器点击返回销毁了, 但还是会执行请求成功或失败的block, 导致野指针异常

原本我以为是我程序框架有问题...后来才知道, 无知真可怕... __unsafe_unretained __block typeof(self) weakSelf = self; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json&qu

黑马程序员---C基础9【字符串的输入输出】【字符串相关函数】【指针】【指针变量初始】【二级指针】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [字符串的输入输出] 1.字符串输出: %s-------从给定的地址开始输出字符直到遇到\0停止: printf("%s\n",&a[3]);  printf("%s\n",a); char a[]="hellowo\0rd!"; 2.字符串输入: 从键盘上接收一个字符串,保存在以a为首地址的字符数组中 scanf("%s&

大钟的ios开发之旅(2)————简单说说ios中ARC与非ARC模式下的property的变量修饰词

/******************************************************************************************** * author:[email protected]大钟 * E-mail:[email protected] *site:http://www.idealpwr.com/ *深圳市动力思维科技发展有限公司 * http://blog.csdn.net/conowen * 注:本文为原创,仅作为学习交流使用,转

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值

野指针与内存操作

1.野指针通常是因为指针变量中保存的值不是一个合法的内存地址而造成的 2.野指针不是NULL指针,是指向不可用内存的指针 3.NULL指针不容易用错,因为if语句很好判断一个指针是不是NULL,C语言中没有任何手段可以判定一个指针是否为野指针 4.(1)局部变量没有被初始化(2)使用已经释放后的指针(3)指针所指向的变量在指针之前被销毁. 5.结构体成员指针未初始化 6.没有为结构体指针分配足够的内存 7.内存分配成功,但并未初始化 8.数组越界 9.内存泄漏,最好单入单出 10.多次指针释放,

&lt;22&gt;【掌握】指针变量概念及定义方法+【理解】两变量值交换的方法+【掌握】总结*使用场合

[掌握]指针变量概念及定义方法 1.指针变量 用来存放地址的变量,就是指针变量 2.指针? 就是地址,地址是个常量 3.指针变量的定义 数据类型 *指针变量名; int *p; //定义了一个指针变量,变量名是p //int表示,p只能存放一个int类型的变量的地址 char *p1; //定义了一个指针变量,变量名是p1 //p1只能存放一个char类型数变量的地址 int num=10; char *p = &num; //警告 4.指针变量定义的注意事项 1)“*” 必须得有,如果没有就相

c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量

一.内存 /* 内存: 存在内存里的. 内存分了N多个小空间,每个小空间1个字节 每个小空间有它自己的地址.每个地址之间差1 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址,而记住首地址就行了(因为首地址相当于入口或者生活中的门) 指针: 指针就是地址,地址就是指针. 地址:内存的地址 内存中的地址: 其实也是从1开始编号,然后一直自增 1M内存,1024个地址 0x7fff5fbff7cc:这叫16进制 十进制:逢10进1 有:0 1 2 3 4 5 6 7 8 9

C语言---指针变量详解1

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量.在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是数组.字符串.函数,也可以是另外的一个普通变量或指针变量. 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示).另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们