您的位置:首页 > 其它

进程僵死,terminate called without an active exception,信号11

2015-12-22 21:49 281 查看
问题描述:

业务进程起来后,很快就会僵死。查看控制台是收到信号11

问题分析:

1:经过加日志定位到,进程僵死在 ct.h 文件中 对 m_pm 指针的使用上,如:if(m_pm == NULL)。

2:进一步发现只有通过 isUSAOG() 》 getCP() 函数 使用m_pm指针才会僵死,其他调用路径进来是没问题的。

3:然后我在 isUSAOG()函数和getCP() 函数加上了 if(m_pm == NULL),运行业务进程发现如下现象:

isUSAOG()函数里 if(m_pm == NULL)正常执行,而getCP()里if(m_pm == NULL)导致进程异常退出,查看控制台信息是:

terminate called without an active exception

4:百度了下“terminate called without an active exception”,

普遍观点是:使用了一个只声明了,但既没初始化也没赋值NULL的指针导致的。

但真的是这样吗??

为了好理解先把简化代码贴出来(include省略)。

RU.h

class RU

{

private:

TU * m_tu;

}

RU.cpp

m_tu->isUSAOG();//m_tu已经被初始化,且它的属性m_pm也是初始化的

TU.h

class TU

{

public:

bool isUSAOG();

bool getCP();

private:

PM * m_pm;//PM是个类

TU * m_tu;

}

TU.cpp

bool TU::getCP()

{

//if(m_pm == NULL){}

D_P_P();

}

bool TU::isUSAOG()

{

//if(m_pm == NULL){}

m_tu->getCP();//此m_tu只声明了,但没初始化

}

ct.h

define D_P_P() \

if(m_pm == NULL){}\

继续分析问题

5:问题分析3里面发现,在进入getCP()函数前,if(m_pm == NULL)正常,而进入getCP()后,if(m_pm == NULL)就会导致进程退出,控制台报terminate called without an active exception。那代码行 m_tu->getCP();就非常可疑了。

6:再仔细看发现一个奇怪的现象:getCP()和isUSAOG()都是类TU的函数,直接调用就可以,比较严谨的方法是用this。但这里为什么用了m_tu指针呢?这个指针是怎么来的呢?与RU类的属性指针m_tu是一个吗?瞬间眼前一亮,继续挖。。。

7:在N千行代码里找了下发现:代码行m_tu->getCP();中的m_tu指针,只在.h声明了,但没有初始化。我靠,拨云见日啊。

8:然而问题又来了,网上说:使用一个指针,如果指针只声明,但既没初始化又没赋值NULL时,报terminate called without an active exception。但这里getCP()函数的确是调进去了啊(尽管进去后有错误)。看来还得再好好梳理下。。。

9:代码行m_tu->getCP();,尽管调通了getCP()函数,但m_tu指针只声明没初始化的本质是改变不了的。对于这个m_tu指针来说属性指针m_pm根本就是不存在的,使用一个不存在的指针后果很严重。

10:到目前为止,问题就比较清晰明朗了。只声明但既没初始化也没赋值NULL的指针m_tu调通了getCP()函数,但在函数里使用根本不存在的m_pm指针时导致进程退出或僵死。

11:现在来回答下分析6中的三个问句。

a:复制、粘贴习惯了,习惯性带上一个对象指针,但不是很了解其具体含义。

b:猜测是在a的因素下,人为在头文件中声明了m_tu。因为N千行的代码就用了一次,声明时还加了解释性注释。哈哈

c:肯定不是一个。这种狸猫换太子类型的坑,是坑中极品。

12:其实还有两个小问题没彻底明白

a:m_tu指针调通了getCP()函数,是否正常?网上普遍观点是不应该调通的,难道与系统有关?我这里是linux,看来只能这么敷衍自己了。

b:在getCP()函数里,直接运行代码if(m_pm == NULL)会导致进程退出,控制台报:terminate called without an active exception。而宏定义D_P_P()中运行代码if(m_pm == NULL)时,进程就会僵死,控制台显示收到了信控11 。看来函数中同样的代码行直接写在函数中与通过宏定义得来还是有区别的(宏定义在其他文件中)。

如果有大牛了解上面两个小问题,请帮忙指点迷津,不胜感激。

ps:问题原因其实很初级,第一次写,大牛请略过,勿拍砖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: